2014-07-26 24 views
2

目前我在_header.html.erb部分有這段代碼application.html.erb從哪裏可以看到許多視圖上使用的代碼

<% current_user.achievements.each do |achievement| %> 
    <li><%= link_to achievement.header_string, polymorphic_path(achievement.achievementable) %></li> 
<% end %> 

current_user.achievements似乎更appropriete放在一個控制器呢?但我不知道該把它放在哪裏,這與Stack Overflow中的標題中的成就相似。此代碼將在所有的意見,如果用戶登錄使用。

回答

1

我沒有看到使用您的意見current_user.achievements什麼不妥,因爲它將再次調出當前用戶的成績,然後軌道caches that query結果你

如果你真的想要把它地方,那麼應用控制器是要什麼動作你希望它設置

def achievements 
    @acheivements = current_user.achievements 
end 

然後在過濾器之前使用的地方

before_filter :achievements, only: [:your_methods] 
1

我會把它在應用程序控制器與一個輔助方法。

helper_method :achievements 

def acheivements(current_user) 
    current_user.achievements.each do |achievement| 
    <do stuff> 
end 

然後,您可以從任何地方調用它,因爲您的所有控制器都從應用程序控制器繼承。

1

TL; DR離開它,因爲它是

法案最後你的問題可以通過兩種方式來解答:

  1. 如果你指的是視圖代碼(即,建立清單),那麼這就是部分的意思。把它放在_header部分你做正確的事情。

  2. 如果您指的是current_user.achievements的調用,並且您認爲視圖觸發數據庫調用時會出錯,我會說:是和否。這是嚴格的MVC邏輯有點不嚴格的地步。在這種情況下,我永遠不會用過濾器方法或實例變量混淆我的控制器。在我看來,讓視圖決定哪些對象的屬性以及可能需要顯示哪些相關對象是非常好的。在故事的控制器的參與可以涵蓋像在現場級的訪問控制(通過設置在未auhorized情況下取得的成就[])。我也認爲你的版本是好的,可讀的和明確的代碼。

+0

爲輸入好,謝謝,非常感謝:) – Pierre

相關問題