创建论坛时,我的form_for方法遇到了烦人的问题。每当我尝试提交创建论坛时,我都会从Rails收到此错误。param is missing or the value is empty: forum
问题出在我的forums_param方法中:
def forum_params
params.require(:forum).permit(:id, :name, :position)
end
论坛部分不存在。下面的代码是我的视图表单:
well.span11
.span7
= form_for @forum, url: forums_path, html: { method: :post } do |f|
= render partial: "form", locals: { f: f }
.actions
= submit_tag 'Create', { class: 'btn btn-primary btn-small' }
.clear
它呈现的部分:
%fieldset
%div{class: 'control-group'}
= label_tag :title, "Title (required)", class: 'control-label required'
%div{class: 'controls'}
= text_field_tag :name, nil, class: 'span8'
- if @forum.errors[:name]
%p{class: 'error'}#{@forum.errors[:name]}
%div{class: 'control-group'}
= label_tag :position, "Position", class: 'control-label'
%div{class: 'controls'}
= text_field_tag :position, nil, size: 5
%div{class: 'control-group'}
= label_tag :description, "Description", class: 'control-label'
%div{class: 'controls'}
= text_area_tag :description, nil, rows: 10, class: 'span10'
以下是控制器代码:
def new
@forum = Forum.new
end
def create
@forum = Forum.new(forum_params)
if @forum.save
redirect_to forums_path, flash: { success: t('.success') }
else
redirect_to forums_path, flash: { error: t('.error') }
end
end
我不确定这里发生了什么。我已经实施了这些帖子中描述的建议。
这是什么问题?非常感谢帮助。
答案 0 :(得分:0)
从我所看到的情况来看,当你从视图转到控制器时,你会遗漏一堆东西。你有描述字段,标题等..这些都没有被纳入forum_params
如果用户可以添加并更改它们,则必须将它们包含在强参数中。我不认为id应该在那里......但是不应该允许用户更改id。这应该是在创建记录时由AR创建的。
答案 1 :(得分:0)
此处的问题似乎是您使用<foo>_tag
而不是f.<foo>_field
。
当您使用<foo>_tag
时,带有您提供的属性的文字标记会显示在DOM中。
text_field_tag
示例:
text_field_tag 'title'
# => <input id="title" name="title" type="text" />
基于文档中的示例。资料来源:the Ruby on Rails API docs for text_field_tag
然而,当您使用f.<foo>_field
时,name
属性在模型名称下被命名空间。
f.text_field
示例:
text_field(:post, :title, size: 20)
# => <input type="text" id="post_title" name="post[title]" size="20" value="#{@post.title}" />
来源:the Ruby on Rails API docs for text_field
稍微深入一点的解释
通过上面的示例,当第一个提交时,参数看起来像:
{ ..., "title" => "user's input", ... }
你可以从中看到,如果你的控制器试图从这个参数哈希中获取:post
,它就是nil
,它会抛出你遇到的错误。
第一部分中第二个示例的参数如下所示:
{ ..., "post" => {"title" => "user's input", ... }, ... }
当控制器试图从此哈希中获取:post
时,它会获得包含title
(以及任何其他表单字段)的子哈希。
我希望这能解决你的问题!