【问题标题】:Mass assignment error in nested form in RailsRails中嵌套形式的质量分配错误
【发布时间】:2013-04-11 03:43:33
【问题描述】:

transaction.rb模特:

class Transaction < ActiveRecord::Base
  attr_accessible :customer, :tickets_attributes
  has_many :tickets
  accepts_nested_attributes_for :tickets
end

ticket.rb模特:

class Ticket < ActiveRecord::Base
  attr_accessible :booking_id, :quantity, :transaction_id
  belongs_to :transaction
  belongs_to :booking
end

在视图页面中,我有一个嵌套的rails 表单,用于ticket 的多个条目:

<%= form_for(@transaction) do |f| %>
  <%= f.text_field :customer %>

  <% @sezzion.bookings.each do |booking| %>
      <%= booking.bookingdate %>:

      <%= f.fields_for :ticket do |t| %>
         <%= t.text_field :quantity, :value => 0, :class => "quantity" %>
         <%= t.hidden_field :booking_id, :value => booking.id %>
      <% end %>

  <% end %>
  <%= f.submit "create transaction" %>
<% end %>

当我提交表单时,出现以下错误:

ActiveModel::MassAssignmentSecurity::Error in TransactionsController#create
Can't mass-assign protected attributes: ticket

我在transaction 模型中有attr_accessible :tickets_attributesaccepts_nested_attributes_for :tickets,但仍然有错误。此外,当我在&lt;%= f.fields_for :ticket do |t| %&gt; 线上向票证添加复数时,quantity 字段不会显示。

【问题讨论】:

    标签: ruby-on-rails-3 nested-forms mass-assignment


    【解决方案1】:

    您的表单f 基于Transaction 对象,该对象has_many :tickets。我相信您应该在 fields_for 中使用复数 :tickets 而不是单数 :ticket

      <%= f.fields_for :tickets do |t| %>
    

    如果您总是想要一张新票,您可能需要这样做:

      <%= f.fields_for :tickets, Ticket.new do |t| %>
    

    以确保显示创建表单。

    【讨论】:

    • 谢谢!现在有了&lt;%= f.fields_for :tickets, Ticket.new do |t| %&gt;,它给出了一个错误ActiveModel::MassAssignmentSecurity::Error in TransactionsController#create Can't mass-assign protected attributes: quantity。我已经在transaction 模型中拥有attr_accessible :tickets_attributes
    【解决方案2】:

    完全重新编辑——对不起,我有一段时间不得不刷新我的记忆

    transaction.rb tickets_attributes 没问题。

    class Transaction < ActiveRecord::Base
        attr_accessible :customer, :tickets_attributes
        has_many :tickets
        accepts_nested_attributes_for :tickets
     end
    

    transaction_controller.rb 您必须构建票证。

    def new
        @transaction = Transaction.new
        @transaction.tickets.build
    end
    

    new.rb 或在您的表单中,fields_for 必须是 :tickets,正如 rob 指出的那样:

    <%= form_for(@transaction) do |f| %>
    
      ...
    
      <%= f.fields_for :tickets do |t| %>
         ...
    

    我认为您可能缺少控制器中的build 部分。希望对您有所帮助!

    【讨论】:

    • 是的,我用复数 tickets 完成了那部分。但是,使用:ticket_attributes,我遇到了错误:ActiveModel::MassAssignmentSecurity::Error in TransactionsController#create Can't mass-assign protected attributes: quantity, tickets_attributes
    • 我经常发现我忘记build 新的嵌套属性。你已经完成了控制器的构建吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多