我為 Rails 專案設定了 Draper's Decorator 來替換原來的助手。我將輔助代碼移至裝飾器:
def birthday(date)
"MinYear#{date.year - 1911} Month#{date.month} Day#{date.day}"
end
并.decorate在視圖中添加文本以使用它
<%= user.decorate.birthday %>
然而,這會導致 ArgumentError wrong number of arguments (given 0, expected 1)
def birthday(date)
如果我洗掉第一個日期,它會出現 NoMethodError undefined method 'date' for #<UserDecorator:0x000055570cbafc58>
"MinYear#{date.year - 1911} Month#{date.month} Day#{date.day}"
我該如何修復這些錯誤?
uj5u.com熱心網友回復:
這ArgumentError是因為您birthday在沒有傳入 a 的情況下呼叫date。
這樣做<%= user.decorate.birthday(Date.current) %>會使錯誤消失。
但是,這可能不是您想要的,因為它date已在User模型中定義。
裝飾某物的最簡單方法是使用delegate_all。它將使User模型中的所有方法在裝飾器中可用。
class UserDecorator < Draper::Decorator
delegate_all
def birthday
"MinYear#{date.year - 1911} Month#{date.month} Day#{date.day}"
end
end
請注意,在您的情況下,裝飾器中宣告的任何方法都將覆寫模型中宣告的方法birthday。例如,如果裝飾器中有其他方法呼叫birthday,它將使用裝飾器中的方法,而不是模型中的方法,模型中的方法可以通過呼叫model.birthday.
另一種方法是在模型物件上呼叫方法:
class UserDecorator < Draper::Decorator
def date
model.date
end
def birthday
"MinYear#{date.year - 1911} Month#{date.month} Day#{date.day}"
end
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/380417.html
