Rails form_for help:param丢失或值为空

时间:2015-01-21 01:22:21

标签: ruby-on-rails

创建论坛时,我的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

我不确定这里发生了什么。我已经实施了这些帖子中描述的建议。

Solution 1

Solution 2

Solution 3

这是什么问题?非常感谢帮助。

2 个答案:

答案 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(以及任何其他表单字段)的子哈希。

我希望这能解决你的问题!