当我尝试加载我的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的问题后秒。 但无论如何,我仍然得到错误,我想知道为什么,如果有修复它。
的创建方法是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
当然你访问,通过故事/新
非常感谢,我并没有想到它会在输入故事/创建时期待这些参数。所以我只是将其重命名为new.html.erb。 –
创建始终是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 %>
改变你确定你的Story
对象属性被命名为story_title
和story_body
?
如果没有,你story_params
应该是这样的:
def story_params
params.require(:story).permit(:title, :body)
end
而且也适用@koshlendra建议,他是对的。
我建议你生成一个脚手架假的资源,看看它是如何工作的:
rails g scaffold Fake title:string body:text
然后查看生成的控制器和视图来了解它完全是如何工作的。
我的属性是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
谢谢!这工作,但我不明白为什么,直到我看到接受答案的观点。你非常乐意帮助 –
。 ..至少你明白了什么是错的。 – bunty
查看你'create.html.erb'?当真? – Pavan
什么是你创造的参数? (看你的服务器运行的控制台窗口) – jvillian
我还是很新的rails,我不应该有一个create.html.erb –