【问题标题】:Can't mass-assign protected attributes in multistep form无法以多步形式批量分配受保护的属性
【发布时间】:2013-04-29 12:19:44
【问题描述】:

我正在做一些我认为很简单但最终变得非常复杂的事情。我已经按照Railscasts 创建了一个多步骤表单。现在我正在尝试在Order 视图中嵌套一个表单,以创建一个父级Customer,如果其中不存在的话(请参阅this 问题)。

基本上,如果客户不存在,我希望创建一个客户来拥有订单。我是不是走错了路?

目前,我得到了

无法批量分配受保护的属性:customer_attributes

当我有订单时belongs_to :customers。但这对我来说似乎最合乎逻辑?我已经把代码放在下面了。

客户模型:

class Customer < ActiveRecord::Base
  attr_accessible :address_1, :address_2, :email, :name, :phone, :user_id

  belongs_to :user
end

订购型号:

class Order < ActiveRecord::Base
  attr_accessible :customer_id, :format, :message, :phone, :quantity

  belongs_to :customer
  accepts_nested_attributes_for :customer
  attr_writer :current_step

...

相关订单控制器方法:

  # GET /orders/new
  # GET /orders/new.json
  def new
    session[:order_params] ||= {}
    @order = Order.new(session[:order_params])
    @order.build_customer(session[:order_params])
    @order.current_step = session[:order_step]
  end

  # POST /orders
  # POST /orders.json
  def create
    session[:order_params].deep_merge!(params[:order]) if params[:order]
    @order = Order.new(session[:order_params])
    @order.current_step = session[:order_step]
    if params[:back_button]
      @order.previous_step
    elsif @order.last_step?
      @order.save
    else
      @order.next_step
    end
    session[:order_step] = @order.current_step

    if @order.new_record?
      render 'new'
    else
      session[:order_step] = session[:order_params] = nil
      flash[:notice] = "Order saved."
      redirect_to @order
    end
  end

查看/订单/新

%h1 New order

= form_for(@order) do |f|
  - if @order.errors.any?
    #error_explanation
      %h2
        = pluralize(@order.errors.count, "error")
        prohibited this order from being saved:
      %ul
        - @order.errors.full_messages.each do |msg|
          %li= msg
  = render "#{@order.current_step}_step", :f => f 
  = f.submit "Continue"
  = f.submit "Back", :name => "back_button" unless @order.first_step?

我试图在其中嵌套表单的部分视图:

.field
  = f.label :quantity    
  = f.text_field :quantity

%h3
  Customer details

=f.fields_for :customer do |builder|
  =builder.label :name
  =builder.text_field :name

  =builder.label :email
  =builder.text_field :email

希望这就是一切。我以前做过嵌套表单,但从未与多步表单结合使用。任何帮助将不胜感激。

【问题讨论】:

标签: ruby-on-rails nested-forms nested-attributes


【解决方案1】:

是的,两者都需要:

attr_accessible :customer_attributes, :customer_id, :format, :message, :phone, :quantity
accepts_nested_attributes_for :customer

attr_accessible 告诉 Rails 那些属性区域是允许的。

accepts_nested_attributes_for 告诉 Rails 将属性委托给其他类。

【讨论】:

    猜你喜欢
    • 2011-09-04
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多