2014-10-08 50 views
1

我正在使用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 %> 

問題是當找到單個對象(來自.find)時.versions工作。然而,當對象的數組(從.find_all_by)傳遞給.versions它返回該錯誤

undefined method `versions' for #<Array:0x007f859d37eb30> 

回答

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 %> 
+0

我「固定」它3分鐘做這個。非常感謝你的幫助。 – user3754124 2014-10-08 15:04:37

+0

我剛剛發現這個解決方案稍微打敗了這個問題。如果我刪除了一個line_item,然後在所有找到的line_items上調用.versions,它顯然不會顯示已刪除的Line_item。 – user3754124 2014-10-09 14:53:30