嵌套属性未在rails中更新

时间:2011-07-15 23:48:36

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

我有3个型号:

class DropShipOrderLineItem < ActiveRecord::Base
  belongs_to :drop_ship_order
  belongs_to :line_item

  validates_associated :drop_ship_order
  validates_associated :line_item
  validates :drop_ship_order_id, :presence => true
  validates :line_item_id, :presence => true

  attr_accessible :missing

end

class DropShipOrder < ActiveRecord::Base

  attr_accessible :line_items, :line_items_attributes, :orders, :order_attributes

  belongs_to  :retailer
  belongs_to  :order
  belongs_to :shipping_method

  has_many    :drop_ship_order_line_items
  has_many    :line_items, :through => :drop_ship_order_line_items
  has_many    :shipments, :dependent => :destroy

  accepts_nested_attributes_for :line_items
  accepts_nested_attributes_for :order
  accepts_nested_attributes_for :drop_ship_order_line_items

  before_create :generate_order_number

  scope :by_number, lambda {|number| where("drop_ship_orders.number = ?", number)}
  scope :between, lambda {|*dates| where("drop_ship_orders.created_at between ? and ?", dates.first.to_date, dates.last.to_date)}
  scope :by_customer, lambda {|customer| joins(:order).joins(:user).where("users.email =?", customer)}
  scope :by_state, lambda {|state| where("state = ?", state)}
  scope :complete, where("drop_ship_orders.completed_at IS NOT NULL")
  scope :incomplete, where("drop+ship_orders.orders.completed_at IS NULL")

  make_permalink :field => :number

  validates_associated :order
  validates_associated :retailer
end

LineItem.class_eval do

  has_one :drop_ship_order_line_item, :dependent => :destroy
  has_one :drop_ship_order, :through => :drop_ship_order_line_items

  accepts_nested_attributes_for :drop_ship_order_line_item

  attr_accessible :drop_ship_order_line_item

#  def missing
#    self.drop_ship_order_line_item.missing
#  end

end

查看#1:

<div data-hook="admin_order_edit_form">
  <div id="order-form-wrapper">
    <%= render :partial => 'form', :locals => {:drop_ship_order => @drop_ship_order} %>
  </div>
</div>

查看表单:

<%= form_for(@drop_ship_order, :url => admin_drop_ship_order_path(@drop_ship_order), :html => { :method => :put}) do |f| %>
  <%= f.hidden_field :number %>
  <table class="index">
    <tbody id='line-items'>
      <tr data-hook="admin_order_form_line_items_headers">
        <th><%= t('item_description') %></th>
        <th class="price"><%= t('price') %></th>
        <th class="qty"><%= t('qty') %></th>
        <th class="total"><span><%= t('total') %></span></th>
        <th class="orders-actions" data-hook="admin_order_form_line_items_header_actions"></th>
      </tr>
      <%= f.fields_for :line_items do |li_form| %>
        <%= render :partial => "admin/drop_ship_orders/line_item", :locals => { :f => li_form } %>
      <% end %>
    </tbody>
    <tbody id='subtotal' data-hook="admin_order_form_subtotal">
      <tr id="subtotal-row">
        <td colspan="3"><b><%= t('subtotal') %>:</b></td>
        <td class="total"><span><%= number_to_currency @drop_ship_order.item_total %></span></td>
        <td></td>
      </tr>
    </tbody>

查看line_item:

<tr id="<%= dom_id(f.object) %>" data-hook="admin_order_form_line_item_row">
  <td width="300"><%=f.object.variant.product.name%> <%= "(" + variant_options(f.object.variant) + ")" unless f.object.variant.option_values.empty? %></td>
  <td valign="top" class="price"><%= number_to_currency f.object.price %></td>
  <td valign="top" class="qty"><strong><%= f.object.quantity %></strong></td>
  <td valign="top" class="total"><%= number_to_currency (f.object.price * f.object.quantity)%></td>
  <td data-hook="admin_order_form_line_item_actions">
    <!--<input type="checkbox" name="apple" id="apples"/>-->
    <%#= f.object.drop_ship_order_line_item.missing %>
    <%= f.fields_for :drop_ship_order_line_item do |build|%>
        <%= build.check_box :missing, :type => "checkbox" %> 
    <% end %>

  </td>
</tr>

:缺少属性没有更新,我只是想不通为什么!虽然如果我手动更改SQL表中的值,则正确勾选复选框。

p.s:我刚刚发布了我的代码的相关部分。

2 个答案:

答案 0 :(得分:1)

在您的LineItem模型中,将attr_accessible :drop_ship_order_line_item更改为attr_accessible :drop_ship_order_line_item_attributes

答案 1 :(得分:0)

什么是:type =&gt;以下代码中的“复选框”:

<%= build.check_box :missing, :type => "checkbox" %> 

check_box表单助手的第二个参数应该是方法。我想如果你改成以下代码,它应该工作:

<%= build.check_box :missing %>