2016-09-08 53 views
0

我正在重構一些代碼。我試圖在我的視圖中使用數組作爲for循環的一部分,該循環在表中創建列。Ruby on Rails:將數組值存儲在變量中並用作字符串

我已經在我的控制器中定義的數組:

subjects_controller.rb

def index 
    ... 
    @CRFS_TO_VIEW = [Baseline, TreatmentCompletion] 
    @CRF_PATH = {Baseline => 'baseline_path', TreatmentCompletion => tc_path} 
end 

所以我的目標;當函數迭代@CRFS_TO_VIEW時,從@CRF_PATH中選擇正確的路徑並將其附加到link_to函數。

indext.html.erb

<% @CRFS_TO_VIEW.each do |crf| %> 
    <% path = @CRF_PATH[crf] %> 
    <%= link_to "edit", path(crf.where(subject_id: sub.subject_id).first %> 
<% end %> 

我也試過:

<%= link_to "edit", @CRF_PATH[crf](crf.where(subject_id: sub.subject_id).first %> 

,沒有工作。我覺得我一定會越來越接近,任何幫助或洞察力將不勝感激。

感謝。

+0

在'@ CRFS_TO_VIEW'數組中,這些元素不應該是字符串嗎?像'@CRFS_TO_VIEW = ['Baseline','TreatementCompletion']'。與@ CRF_PATH相同。 – treiff

+0

可能是這樣,我會試一試。但在此之前,將@CRF_PATH [crf]保存到路徑不起作用。路徑未被識別。也許我不能在視圖中聲明一個變量? –

+0

因此@CRFS_TO_VIEW不起作用,因爲這些項目不是字符串。它們是控制器的參考。這樣Baseline.create(id)應該可以工作。 –

回答

2

幾件事:

a。你應該節省一些時間,並通過字典而不是陣列循環:

<% @CRF_PATH.each do |crf, path| %> 
... 
<% end %> 

b。你是從循環得到一個字符串 - 你可以用send調用等效的方法:

<%= send(path, ...) %> 

℃。你可以簡化你使用的對象檢索:

crf.find_by(subject_id: sub.subject_id) 

這就是說 - 這看起來像是一個很糟糕的做事方式。我建議,而不是添加一個視圖助手:

def crf_path(crf) 
    case crf 
    when Baseline then baseline_path(crf) 
    ... 
end 

像這樣的東西,你可以使用(注意改變了find_byfind_by!安全以及):

<% @CRFS_TO_VIEW.each do |crf| %> 
    <%= link_to "edit", crf_path(crf.find_by!(subject_id: sub.subject_id) %> 
<% end %> 

最後實例變量應該NOT被命名爲大寫。如果你想使用一個常量,將其定義爲常量(否則使用小寫名稱)。

+0

這非常有幫助。我甚至不認爲我可以用這種方式使用視圖助手。我認爲這是我正在尋找的答案,我花了一些時間,也許會問你一兩個問題。非常感謝。 –

+0

這些視圖助手僅適用於rails 4.0及更高版本嗎?或者更好的問題,我把幫助者放在哪裏? –

+0

@IanEllis你可以把它們放在'app/helpers/application_helper.rb'下。 –

相關問題