2014-09-23 29 views
2

在我的Rails應用程序的分離,我有以下的關聯:「告訴,不要問」,同時保持關注

  • 視頻屬於類型(視頻不必有流派)
  • 類型有許多影片(體裁可以沒有視頻)

在視頻模型中,我有以下方法。

# models/video.rb 
def genre_name 
    genre.present? ? genre.name : '' 
end 

這是爲了避免在視圖中這樣的事情(這似乎只是凌亂):

# views/videos/show.html.erb 
<% if @video.genre.present? %> 
    <%= @video.genre.name %> 
<% else %> 
    No Genre Present 
<% end %> 

相反,我可以做到這一點(它看起來更爲整潔)

# views/videos/show.html.erb 
<%= @video.genre_name %> 

但是,它不適合要求有關視頻模型中流派的信息。組織此代碼的最佳方式是什麼?我應該使用助手嗎?

回答

2

如果你發現自己做這種事情很多,它可能是值得探討一個裝飾模式,它可以容納這樣的視圖邏輯。 (我很喜歡使用Draper用於此目的,但它不是很難推出自己的幼稚的做法。)

然後,你的裝飾邏輯可以是這樣的:

class VideoDecorator def genre_name object.genre.try(:name).presence || "Fallback" end end

可以包在一個裝飾模式,你在控制器渲染:

@video = Video.find(params[:id]) 
respond_with @video.decorate 

而且您的視圖「邏輯」(或缺乏)可以是這樣的應用範圍:

<%= @video.genre_name %> 

Thoughtbot有裝飾圖案here

+0

我喜歡這個,因爲它從視頻模型中刪除了genre_name方法。 – 2014-09-23 10:54:10

+0

即將採用此方法。 :) 謝謝 – 2014-09-23 11:00:44

2

你可以在你看來

<%= @video.genre.try(:name) || 'No Genre Present' %> 

寫如果你不需要後備文字,只是

<%= @video.genre.try(:name) %> 

Read more about Object#try here

如果你想回退時也name是一個空字符串(不只是nil),可以使用Object#presence

<%= @video.genre.try(:name).presence || 'No Genre Present' %> 
+0

這是非常好的一個很好的解釋。我特別喜歡第一個例子:)謝謝。 – 2014-09-23 10:35:47

+0

但是,我不知道是否有辦法在不將邏輯放入視圖中的情況下執行此操作? – 2014-09-23 10:42:07

相關問題