10

我正在尝试在 Rails 4 中重现railscast #196。但是,我遇到了一些问题。

在我的示例中,我尝试生成一个电话簿 - 每个人可以有多个电话号码

这些是我的控制器的重要部分:

class PeopleController < ApplicationController
    def new
        @person = Person.new
        3.times{ @person.phones.build }
    end

    def create
        @person = Person.create(person_params)
        @person.phones.build(params[:person][:phones])

        redirect_to people_path
    end

private

    def person_params
        params.require(:person).permit(:id, :name, phones_attributes: [ :id, :number ])
    end
end

这是我的新观点

<h1>New Person</h1>

<%= form_for :person, url: people_path do |f| %>
    <p>
        <%= f.label :name %> </ br>
        <%= f.text_field :name %>
    </p>

    <%= f.fields_for :phones do |f_num| %>
        <p>
            <%= f_num.label :number %> </ br>
            <%= f_num.text_field :number %>
        </p>
    <% end %>

    <p>
        <%= f.submit %>
    </p>
<% end %>

不用说我在我的人模型和has_many :phones电话模型中都有。accepts_nested_attributes_for :phonesbelongs_to :person

我有以下问题:

  1. 新表单中只有一个,而不是 3 个电话号码字段
  2. 当我提交表单时,我收到一个错误:

ActiveModel::ForbiddenAttributesError

在行中

@person.phones.build(params[:person][:phones])

参数:

{"utf8"=>"✓",
 "authenticity_token"=>"l229r46mS3PCi2J1VqZ73ocMP+Ogi/yuYGUCMu7gmMw=",
 "person"=>{"name"=>"the_name",
 "phones"=>{"number"=>"12345"}},
 "commit"=>"Save Person"}

原则上我想把这整个事情作为一个表单对象来做,但我认为如果我什至没有用 Accept_nested_attributes 得到它,我就没有机会把它作为一个表单对象来做:(

4

1 回答 1

12

为了让视图中的三个电话更改form_for :personform_for @person(您想使用您在此处构建的对象),如下所示:

<%= form_for @person, url: people_path do |f| %>

这也应该修复ForbiddenAttributes错误。

你的create行动可能是:

def create
    @person = Person.create(person_params)

    redirect_to people_path
end

更新:

<%= form_for :person do |f| %>为模型创建一个通用表单,Person并且不知道您应用于特定对象的其他详细信息(在这种情况下@person是在您的new操作中)。您已将三个附加phones@person对象上,这@person:person您在视图中没有看到三个电话字段的原因不同。请参考:http ://apidock.com/rails/ActionView/Helpers/FormHelper/form_for了解更多详情。

于 2013-08-30T20:51:05.580 回答