如何在fields_for中引用符号的活动记录关系

时间:2012-08-03 16:17:01

标签: ruby-on-rails ruby block relationship erb

在fields_for块中,我如何引用关系字段的值。

例如:

应用/模型/ cart.rb

class Cart < ActiveRecord::Base
  attr_accessible :lineitems_attributes
  has_many :lineitems, dependent: :destroy
  accepts_nested_attributes_for :lineitems

  def total_price
    lineitems.to_a.sum { |item| item.total_price }
  end
end

应用/模型/ lineitem.rb

class Lineitem < ActiveRecord::Base
  attr_accessible :cart_id, :quantity, :package_id, :part_id
  belongs_to :cart
  belongs_to :package
  belongs_to :part

  def total_price
    if package_id?
      return package.price * quantity
    end

    if part_id?
      return part.price * quantity
    end
  end
end

应用/模型/ package.rb

class Package < ActiveRecord::Base
  attr_accessible :description, :img_src, :name, :price
  has_many :lineitems
end

应用/视图/购物车/ _form.html.erb

<%= form_for @cart do |f| %>
  <%= c.fields_for :lineitems do |i| %>
    <%= render 'lineitem_fields', :f => i %>
  <% end %>
  <%= c.submit %>
<% end %>

应用/视图/购物车/ _lineitem_fields.html.erb

<%= f.text_field :quantity %>

<% if :package_id? %>
  <%= f.text_field :package_id %>
<% else %>
  <%= f.text_field :part_id %>
<% end %>

<%= link_to 'Remove',
         lineitem_path(:id),
         :method => :delete,
         :confirm => t('.confirm', :default => t("helpers.links.confirm",
         :default => 'Are you sure?')) %>    

架构的相对部分

create_table "carts", :force => true do |t|
  t.integer "branch_id"
  t.datetime "created_at", :null => false
  t.datetime "updated_at", :null => false
end

create_table "lineitems", :force => true do |t|
  t.integer "cart_id"
  t.integer "part_id"
  t.integer "package_id"
  t.integer "quantity", :default => 1
  t.datetime "created_at", :null => false
  t.datetime "updated_at", :null => false
end

create_table "parts", :force => true do |t|
  t.string "description"
  t.string "partNumber"
  t.decimal "price"
  t.datetime "created_at", :null => false
  t.datetime "updated_at", :null => false
end

create_table "packages", :force => true do |t|
  t.string "description"
  t.string "name"
  t.string "img_src"
  t.decimal "price"
  t.datetime "created_at", :null => false
  t.datetime "updated_at", :null => false
end

以上表格有效但......

问题1:如何显示package.name而不是:package_id

问题2:如何在表单中显示每个lineitem的total_price。这是一种如何运作的方法?

问题3:是否有最佳做法以发票方式显示表单,其中数量可能是文本字段,但列的其余部分只是文本或标签?

最终游戏场景是此表单将是在提交订单之前编辑购物车数量(或删除lineitems)的最后机会。显然,在现实世界中,您想要显示数量,包名称,描述和价格,但我似乎无法弄清楚如何在表单中显示这些值,因为它们是按关系而不是特定于lineitems的另一个模型。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您正在寻找ActionView :: Helpers :: ActiveModelInstanceTag#对象方法。这使您可以在表单内的任何位置访问ActiveRecord。

1

<% if f.object.package_id? %>
  <%= text_field_tag :package_name, f.object.package.name %>
  <%= f.hidden_field :package_id %>
<% else %>

2 <%= f.object.total_price %>

3也许在除数量之外的所有输入标签上尝试:readonly => true选项?