为了账号安全,请及时绑定邮箱和手机立即绑定

嵌套属性未允许的参数

/ 猿问

嵌套属性未允许的参数

HUX布斯 2019-08-16 15:20:53

嵌套属性未允许的参数

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

相关代码如下:

due.rb

class Due < ActiveRecord::Base
    belongs_to :person
    belongs_to :billend

bill.rb

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

bills_controller.rb

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

票据/ _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 %>

票据/ _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 -0700Processing 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有没有变化?


查看完整描述

3 回答

?
ibeautiful

似乎属性保护的处理发生了变化,现在你必须将控制器中的params列入白名单(而不是模型中的attr_accessible),因为前一个可选的gem strong_parameters成为了Rails Core的一部分。

这应该是这样的:

class PeopleController < ActionController::Base
  def create    Person.create(person_params)
  endprivate  def person_params
    params.require(:person).permit(:name, :age)
  endend

所以params.require(:model).permit(:fields)会被使用

对于嵌套属性,例如

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

可以在github此处Ruby edge API文档strong_parameters中找到更多详细信息


查看完整回答
反对 回复 2019-08-16
?
郎朗坤

似乎属性保护的处理发生了变化,现在你必须将控制器中的params列入白名单(而不是模型中的attr_accessible),因为前一个可选的gem strong_parameters成为了Rails Core的一部分。

这应该是这样的:

class PeopleController < ActionController::Base
  def create    Person.create(person_params)
  endprivate  def person_params
    params.require(:person).permit(:name, :age)
  endend

所以params.require(:model).permit(:fields)会被使用

对于嵌套属性,例如

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

可以在github此处Ruby edge API文档strong_parameters中找到更多详细信息


查看完整回答
反对 回复 2019-08-16
?
123456qqq

或者你可以简单地使用

def question_params

  params.require(:question).permit(team_ids: [])end


查看完整回答
反对 回复 2019-08-16
  • 3 回答
  • 0 关注
  • 93 浏览
我要回答

相关问题推荐

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信