2011-10-25 47 views
2

我在我的haml視圖中出現了一個奇怪的錯誤。當我要求model.id時,它將返回object_id,但僅限於某些地方。例如:Model#id在haml視圖中返回#object_id

%ul 
    - @items.each do |item| 
    %li{:class => "item", :id => "item_#{item.id}"}= link_to(item.name,item) 

上面的代碼將呈現這樣的:

<ul> 
    <li class="item" id="item_104589"><a href="/items/1">Test1</a></li> 
    <li class="item" id="item_104590"><a href="/items/2">Test2</a></li> 
</ul> 

我說這是一個奇怪的錯誤,因爲它只是發生在生產環境和鏈接都是正確的。 項目的數組是「裝飾」使用Drapper寶石。我沒有使用HAML的縮寫形式,因爲這樣:

%li[item] 

呈現:

<li class="item_decorator" id="item_decorator_xxx">...</li> 
+0

使用item [:id]而不是item.id解決了我的問題。更奇怪:/ – beagleknight

+1

視圖內的'item.class'返回什麼? –

+0

'item.class'返回'ItemDecorator'。你認爲這是問題嗎? – beagleknight

回答

0

感謝Leonid,我發現這個問題與ItemDecorator

ItemDecorator覆蓋從Item類中的方法id

item = ItemDecorator.decorate(item) 
=> #<ItemDecorator:0xcdbcc78 @context={}, ... 
irb(main):004:0> item.id 
(irb):4: warning: Object#id will be deprecated; use Object#object_id 
=> 107865660 

我不知道這是Drapper或不是一個錯誤。

+0

它不會*重寫它,它只是不會將其代入真正的Item中,而是返回它自己的對象ID。 –

+0

我已安裝Draper 0.9.3,它的工作原理。他們現在代理'id'。 – beagleknight

+0

無論如何,這個叉子都起了什麼作用?它似乎有意[*刪除*](https://github.com/esdras/draper/blob/master/lib/drapper/base.rb#L8)'id'代理...並更改了名稱模塊「Drapper」?什麼?爲什麼?是的,使用原始代碼庫可能是一個好主意。 – numbers1311407