2013-05-03 52 views
-1

我在我的Rails應用程序看起來像這樣的HTML代碼:結合HTML和紅寶石

<td><%= MyObj.find_by_id(@my_obj.some_id).name %></td> 

,這表明了罰款。但是,數據庫中並不總是顯示some_id字段,所以我想在這些情況下顯示NA而不是MyObj的名稱。

因此,這裏就是我的意思是在僞代碼:

<td><%= IF @my_obj.some_id is NIL THEN "NA" ELSE MyObj.find_by_id(@my_obj.some_id).name %></td> 

我怎樣才能做到這一點?如果你在你這樣的視圖代碼查找記錄

<td><%= @my_obj.some_id.present? ? MyObj.find(@my_obj.some_id).name : 'NA' %></td> 

但是,你暴露自己的一些相當大的問題:

+1

嗯,你的僞代碼有一個相當直接的翻譯成Ruby和'<%= ... %>'裏面的東西'只是Ruby代碼所以... – 2013-05-03 03:53:07

回答

2

您可以使用下面的代碼片段。你的控制器應該處理那種邏輯。

+0

太好了,謝謝。我不知道你可以在ruby中做這樣的事情 – CodeGuy 2013-05-03 03:56:39

+0

@CodeGuy只是留意警告 - 只是因爲你可以在Ruby中做這樣的事情,並不意味着你應該這樣做。 – 2013-05-03 04:09:36

1

您不應該在視圖代碼中敲擊數據庫,將其留給控制器。嘗試加載對象在你的控制器來代替:

# use this code to your controller 
@view_obj = MyObj.find_by_id(@my_obj.some_id) 

然後,您可以使用try方法來設置名稱,它將返回nil反而提高了通常的NoMethodError,如果對象是nil

<%= @view_obj.try(:name) || "NA" %> 
-2

<%=!MyObj.find_by_id(@ my_obj.some_id).name.blank? ? MyObj.find_by_id(@ my_obj.some_id).name:「NA」%>

+1

如果'MyObj.find_by_id(@ my_obj.some_id)'返回'nil',這將引發'NoMethodError'異常,這正是問題所在。 – 2013-05-03 05:49:39

+0

<%= MyObj.find_by_id(@ my_obj.some_id)!= nil &&!MyObj.find_by_id(@ my_obj.some_id).name.blank? ? MyObj.find_by_id(@ my_obj.some_id).name:「NA」%> – Kushal 2013-05-03 05:55:41

+0

如果你想這樣做,它應該是'<%= MyObj.find_by_id(@ my_obj.some_id).nil? ? 「NA」:MyObj.find_by_id(@my_obj_some_id).name%>' - 從問題出發,不需要檢查名稱是否爲空,只要對象存在。你也在同一行中多次訪問數據庫,這不是一個好主意(確定它可能會被緩存,但仍然會),特別是在視圖中。 – 2013-05-03 06:10:15