我使用paper trail gem跟踪订单Web应用程序的版本更改。我在显示has_many版本时遇到问题
订单型号:
class Order < ActiveRecord::Base
has_paper_trail
has_many :line_items, dependent: :destroy, inverse_of: :order, order: "position", autosave: true
end
订单项型号:
class LineItem < ActiveRecord::Base
belongs_to :order, inverse_of: :line_items
has_paper_trail
end
订单控制器:
@order = Order.find(params[:id])
@versions = PaperTrail::Version.where(item_id: params[:id]).order('created_at ASC')
@line_items = LineItem.find_all_by_order_id(params[:id])
@line_item_versions = @line_items.versions
历史记录html:
<% @line_item_versions.each_with_index do |version, index| %>
<b>Version: </b><%= index + 1 %><br/>
Event ID: <%= version.id %><br/>
<b>Target:</b> <%= version.item_type %>
<small>(id: <%= version.item_id %>)</small>; <b>action</b> <%= version.event %>;<br/>
<% end %>
问题是.versions
在找到单个对象(来自.find
)时有效。但是,当一个对象数组(来自.find_all_by
)传递给.versions
时,它会返回此错误
undefined method `versions' for #<Array:0x007f859d37eb30>
答案 0 :(得分:1)
您正在定义:
@line_items = LineItem.find_all_by_order_id(params[:id])
这意味着@line_items
是一个包含多个LineItem记录的数组。然后,你打电话:
@line_item_versions = @line_items.versions
但.versions
方法是LineItem的实例方法(一个line_item has_many versions
)。这会导致错误undefined method 'versions' for Array
(此处@line_items
是一个数组)。
要解决此问题, 我认为你应该做以下事情(但有很多选择,取决于你想做什么):
<% @line_items.each do |line_item| %>
<%= line_item.name %>
<% line_item.versions.each_with_index do |version, index| %>
<b>Version: </b><%= index + 1 %><br/>
Event ID: <%= version.id %><br/>
<b>Target:</b> <%= version.item_type %>
<small>(id: <%= version.item_id %>)</small>; <b>action</b> <%= version.event %>;<br/>
<% end %>
<% end %>