gpt4 book ai didi

ruby-on-rails - 嵌套属性不允许的参数

转载 作者:行者123 更新时间:2023-12-03 04:30:49 24 4
gpt4 key购买 nike

我有一个 Bill 对象,其中有许多 Due 对象。 Due 对象也属于 Person。我想要一个可以在一个页面中创建 Bill 及其子 Dues 的表单。我正在尝试使用嵌套属性创建一个表单,类似于 this Railscast 中的属性.

相关代码如下:

到期.rb

class Due < ActiveRecord::Base
belongs_to :person
belongs_to :bill
end

账单.rb

class Bill < ActiveRecord::Base
has_many :dues, :dependent => :destroy
accepts_nested_attributes_for :dues, :allow_destroy => true
end

bills_controller.rb

  # GET /bills/new
def new
@bill = Bill.new
3.times { @bill.dues.build }
end

bills/_form.html.erb

  <%= form_for(@bill) do |f| %>
<div class="field">
<%= f.label :company %><br />
<%= f.text_field :company %>
</div>
<div class="field">
<%= f.label :month %><br />
<%= f.text_field :month %>
</div>
<div class="field">
<%= f.label :year %><br />
<%= f.number_field :year %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<%= f.fields_for :dues do |builder| %>
<%= render 'due_fields', :f => builder %>
<% end %>
<% end %>

bills/_due_fields.html.erb

<div>
<%= f.label :amount, "Amount" %>
<%= f.text_field :amount %>
<br>
<%= f.label :person_id, "Renter" %>
<%= f.text_field :person_id %>
</div>

更新到 bills_controller.rb这有效!

def bill_params 
params
.require(:bill)
.permit(:company, :month, :year, dues_attributes: [:amount, :person_id])
end

页面上会呈现正确的字段(尽管还没有 Person 的下拉列表)并且提交成功。但是,没有任何子项会费保存到数据库中,并且服务器日志中会抛出错误:

Unpermitted parameters: dues_attributes

就在错误发生之前,日志显示以下内容:

Started POST "/bills" for 127.0.0.1 at 2013-04-10 00:16:37 -0700
Processing by BillsController#create as HTML<br>
Parameters: {"utf8"=>"✓",
"authenticity_token"=>"ipxBOLOjx68fwvfmsMG3FecV/q/hPqUHsluBCPN2BeU=",
"bill"=>{"company"=>"Comcast", "month"=>"April ",
"year"=>"2013", "dues_attributes"=>{
"0"=>{"amount"=>"30", "person_id"=>"1"},
"1"=>{"amount"=>"30", "person_id"=>"2"},
"2"=>{"amount"=>"30", "person_id"=>"3"}}}, "commit"=>"Create Bill"}

Rails 4 有什么变化吗?

最佳答案

似乎属性保护的处理发生了变化,现在您必须将 Controller 中的参数列入白名单(而不是模型中的 attr_accessible),因为以前的可选 gem Strong_parameters 已成为 Rails Core 的一部分。

这应该看起来像这样:

class PeopleController < ActionController::Base
def create
Person.create(person_params)
end

private
def person_params
params.require(:person).permit(:name, :age)
end
end

因此将使用params.require(:model).permit(:fields)

对于嵌套属性,类似于

params.require(:person).permit(:name, :age, pets_attributes: [:id, :name, :category])

更多详细信息可以在Ruby edge API docs中找到和 strong_parameters on githubhere

关于ruby-on-rails - 嵌套属性不允许的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15919761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com