spe*_*ndo 10 ruby-on-rails object nested-forms nested-attributes
我试图在Rails 4中重现railscast#196.但是,我遇到了一些问题.
在我的例子中,我尝试生成一个电话簿 - 每个人可以有多个PhoneNumbers
这些是我的控制器的重要部分:
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
Run Code Online (Sandbox Code Playgroud)
这是我的新观点
<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 %>
Run Code Online (Sandbox Code Playgroud)
不用说,我有has_many :phones和accepts_nested_attributes_for :phones在我一个人的模型,并belongs_to :person在手机型号.
我有以下问题:
::加载ActiveModel ForbiddenAttributesError
在线
@person.phones.build(params[:person][:phones])
Run Code Online (Sandbox Code Playgroud)
参数:
{"utf8"=>"?",
"authenticity_token"=>"l229r46mS3PCi2J1VqZ73ocMP+Ogi/yuYGUCMu7gmMw=",
"person"=>{"name"=>"the_name",
"phones"=>{"number"=>"12345"}},
"commit"=>"Save Person"}
Run Code Online (Sandbox Code Playgroud)
原则上我想做整个事情作为一个表单对象,但我想如果我甚至没有使用accepts_nested_attributes,我没有机会作为一个表单对象:(
vee*_*vee 12
为了让视图中的三部手机更改form_for :person为form_for @person(您希望使用此处构建的对象),如下所示:
<%= form_for @person, url: people_path do |f| %>
Run Code Online (Sandbox Code Playgroud)
这也应该解决ForbiddenAttributes错误.
你的create行动可能是:
def create
@person = Person.create(person_params)
redirect_to people_path
end
Run Code Online (Sandbox Code Playgroud)
更新:
<%= form_for :person do |f| %>为Person模型创建通用表单,并且不知道您应用于特定对象的其他详细信息(在本例@person中为您的new操作).您已将三个附加phones到@person对象上,并且@person与:person您在视图中未看到三个电话字段的原因不同.请参阅:http://apidock.com/rails/ActionView/Helpers/FormHelper/form_for以获取更多详细信息.
| 归档时间: |
|
| 查看次数: |
15168 次 |
| 最近记录: |