【问题标题】:Rails 3 Mass-Assignment Errors with fields_for带有fields_for的Rails 3质量分配错误
【发布时间】:2012-08-21 18:52:55
【问题描述】:

我有以下模型关系:
订单模型:

has_one :credit_card
    accepts_nested_attributes_for :credit_card
    attr_accessible :user_id, :date_updated, :date_finished, :amount, :payment_method, :status, :billing_cycle, :auth_net_subscription_id, :billing_start_date, :credit_card_attributes, :billing_address_id, :cc_id

信用卡型号:

belongs_to :order

这是我的订单控制器 (orders#checkout)

def checkout
  @order = current_order
  @cc = CreditCard.new
  @order.build_credit_card
  respond_with @order
end

这是在订单上输入抄送的表格:

<%= form_for(@order, :url => finish_checkout_path, :html => { :class => 'validate' }) do |f| %>
    <%= f.fields_for @cc do |cc| %>
        <%= cc.text_field :cc_number, :placeholder => "Credit Card Number", :class => "full-width validate[required, creditCard] cc" %>
        <%= cc.text_field :name, :placeholder => "Name as it appears on card", :class => "full-width validate[required]" %>
        <%= select_month(Date.today, {:field_name => 'exp_month', :prefix => "order[credit_card]", :prompt => "EXP. MONTH"}, { :class => "dk half-width validate[required,past] marginRight10" }) %>
        <%= select_year(Date.today, {:field_name => 'exp_year', :prefix => "order[credit_card]", :prompt => "EXP. YEAR", :start_year => Date.today.year, :end_year => Date.today.year + 10}, { :class => "dk half-width validate[required]" }) %>
        <%= link_to "What's this?", "#", :class => 'cvv-help' %>
        <%= cc.text_field :cvv, :class => 'half-width validate[required] marginRight10', :placeholder => "CVV" %>
        <%= cc.text_field :zip_code, :class => 'half-width validate[required]', :placeholder => "Zip Code" %>
    <% end %>
    <%= f.hidden_field :amount, :value => @order.products.collect(&:price).reduce(&:+) %>
    <p class="tos">By clicking the button below you agree to our <a href="#" class="pink">terms of service</a>.</p>
    <p class="align-center"><%= f.submit "Submit", :class => 'btn submit' %></p>
<% end %>

这里是我更新订单的地方(orders#finish):

current_order.update_attributes(params[:order])

当我这样做时,我收到以下错误:Can't mass-assign protected attributes: credit_card

我的 attr_accessible 中显然有 credit_card_attributes,所以我不确定为什么会出错。

【问题讨论】:

  • 您的信用卡模型中有 attr_accessible 的信用卡列表吗?
  • 是的。 attr_accessible :user_id, :name, :cc_number, :cvv, :last_four, :exp_month, :exp_year, :zip_code, :order_id

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


【解决方案1】:

不确定,但可能是因为您的控制器代码:

def checkout
   @order = current_order
   @cc = CreditCard.new
   @order.build_credit_card
   respond_with @order
end

这样,您在 fields_for 中使用的信用卡就不会与您的订单相关联。这可能是问题所在。

尝试这样做:

def checkout
   @order = current_order
   @order.build_credit_card
   respond_with @order
end

<%= f.fields_for :credit_card do |cc| %>

【讨论】:

  • 我试过你提到的,但我仍然收到Can't mass-assign protected attributes: credit_card
  • 将 :credit_card 添加到您的 attr_acc 列表中怎么样?即使我应该是credit_card_attributes...另外,你能显示你在完成动作中得到的参数吗?
  • 搞定了!非常感谢你的帮助!这是因为我的 select_monthselect_year Rails 助手......我设置的是 :prefix =&gt; "order[credit_card]" 而不是 :prefix =&gt; "order[credit_card_attributes]"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 2011-10-03
  • 1970-01-01
相关资源
最近更新 更多