当我尝试加载我的create.html.erb页面时,出现此错误“param丢失或值为空”

当我尝试加载我的create.html.erb页面时,出现此错误“param丢失或值为空”

问题描述:

我在加载页面时出现此错误,并且我猜测它有一些与我的操作有关的错误在控制器 我的控制器看起来像这样当我尝试加载我的create.html.erb页面时,出现此错误“param丢失或值为空”

class StoryController < ApplicationController 
def index 
    @story = Story.all 
end 

def new 
    @story = Story.new 
end 

def create 
    @story = Story.new(story_params) 
    if @story.save 
     flash[:notice] = "Story created successfully" 
     flash[:color]= "valid" 
    else 
     flash[:notice] = "Story is invalid, man" 
     flash[:color]= "invalid" 
end 

end 

def show 
    @story = Story.find(params[:id]) 
end 
private 
def story_params 
params.require(:story).permit(:story_title, :story_body) 
end 

end 

我create.html.erb看起来像

 <%= form_for @story ,url: story_path do |f| %> 
     <%= label :story, :title %><br /> 
     <%= text_field :story, :story_title %> 

     <%= label :story, :body %><br /> 
     <%= text_field :story, :story_body %> 
     <%= submit_tag 'Create story' %> 
     <% end %> 

我create.html.erb didnt之前是这样创造的方法,我把它改成是在阅读了关于如何使用form_for而不是form_tag for story_param的问题后秒。 但无论如何,我仍然得到错误,我想知道为什么,如果有修复它。

+0

查看你'create.html.erb'?当真? – Pavan

+0

什么是你创造的参数? (看你的服务器运行的控制台窗口) – jvillian

+0

我还是很新的rails,我不应该有一个create.html.erb –

的创建方法是POST ......所以,当他进入故事/创建,他已经期待着这些价值观......这就是为什么他说,他无法找到params ...我没有深入地看代码,但看起来很好。只需将视图的名称更改为new.html.erb即可。新建是创建的设置。

在new中设置值,然后在控制器实际创建故事的地方调用create。

只需更改视图的名称new.html.erb并将其更改为这个

<%= form_for @story do |f| %> 
<%= f.label :title %><br /> 
<%= f.text_field :story_title %> 
<%= f.label :body %><br /> 
<%= f.text_field :story_body %> 
<%= submit_tag 'Create story' %> 
<% end %> 

与其他网友说。你需要说这些输入属于form | f |在text_field属于楼f.text_field

当然你访问,通过故事/新

+0

非常感谢,我并没有想到它会在输入故事/创建时期待这些参数。所以我只是将其重命名为new.html.erb。 –

+0

创建始终是POST方法...它不使用视图:)很高兴我可以帮助 – Boltz0r

试试这个让在create.html.erb

<%= form_for @story ,url: story_path do |f| %> 
    <%= f.label :title %><br /> 
    <%= f.text_field :story_title %> 

    <%= f.label :body %><br /> 
    <%= f.text_field :story_body %> 
    <%= submit_tag 'Create story' %> 
    <% end %> 
+0

非常感谢你的回答,但我仍然得到相同的错误 –

+0

你可以在这里给错误? – Sunny

+0

param丢失或者值为空:故事 –

改变你确定你的Story对象属性被命名为story_titlestory_body

如果没有,你story_params应该是这样的:

def story_params 
params.require(:story).permit(:title, :body) 
end 

而且也适用@koshlendra建议,他是对的。

我建议你生成一个脚手架假的资源,看看它是如何工作的:

rails g scaffold Fake title:string body:text 

然后查看生成的控制器和视图来了解它完全是如何工作的。

+0

我的属性是story_title和story_body,这是肯定的。我自己生成了它们。生成一个假脚手架会帮助我更好地理解,谢谢! –

首先,如果您使用form_for并且您不想在自定义路由上提交表单,则不需要指定路径。

如果您使用的是新对象,那么它将在create方法上提交表单,并为现有对象提交表单上的update方法。

所以你的形式将是,

<%= form_for @story do |f| %> 
    <%= f.label :title %><br /> 
    <%= f.text_field :story_title %> 
    <%= f.label :body %><br /> 
    <%= f.text_field :story_body %> 
    <%= submit_tag 'Create story' %> 
<% end %> 

这种形式需要在new.html.erb文件。

此表单将提交您的表单以使用post方法创建动作,并且您需要根据条件进行渲染或重定向。所以,你的控制器会,

class StoryController < ApplicationController 
    def index 
    @story = Story.all 
    end 

    def new 
    @story = Story.new 
    end 

    def create 
    @story = Story.new(story_params) 
    if @story.save 
     flash[:notice] = "Story created successfully" 
     flash[:color]= "valid" 
     redirect_to story_path(@story) 
    else 
     flash[:notice] = "Story is invalid, man" 
     flash[:color]= "invalid" 
     render :new 
    end 
    end 

    def show 
    @story = Story.find(params[:id]) 
    end 

    private 
    def story_params 
    params.require(:story).permit(:story_title, :story_body) 
    end 
end 

如果您在termial做rake routes,你可以看到它的预期的方法的所有方法

此外,根据Rails的惯例,如果你有故事模式,那么你可以直接创建:标题&:身体属性,而不是:STORY_TITLE和:story_body

+0

谢谢!这工作,但我不明白为什么,直到我看到接受答案的观点。你非常乐意帮助 –

+0

。 ..至少你明白了什么是错的。 – bunty