2012-05-11 106 views
1

我對Rails相當陌生,對於如何在if ... else語句之外傳遞局部變量感到困惑。它看起來像在助手文件中創建一個方法是傳統的方式來做到這一點,但我不知道如何做到這一點。如何在Rails 3中定製助手?

所以我試圖讓任務的作者。如果任務的作者不存在,我想使用其父級教學大綱的作者(任務屬於教學大綱)。然後我想打印出該作者的用戶名。我能做到這一點時,我正在處理只有一個任務,如:

//controller 
@mission = Mission.first 
if [email protected]? 
    @author = @mission.author 
else 
    @author = @mission.syllabus.author 
end 

//view 
<%= @author.username %> 

,但我不知道如何做到這一點時,我正在處理foreach循環:

//controller 
@mission = Mission.all 

//view 
<% @mission.each do |mission| %> 
..(where do I put the logic of finding author? I can't put it in my controller anymore and it won't pass the @author variable outside the if else statement if I put the logic here in the view).. 
<%= @author.username %> 
<% end %> 

我徒勞的嘗試是創造一個幫手:

def author_getter(mission_id) 
    @mission = Mission.find(params[:mission_id]) 
    if [email protected]? 
    @author = @mission.author 
    return @author 
    else 
    @author = @mission.syllabus.author 
    return @author 
    end 
end 

,並把下面的循環中

<%= author_getter(mission) %> 

但是,這沒有奏效。在if ... else語句之外傳遞變量的最佳方法是什麼?

回答

3

你的幫手方法有點困惑。幫手不應該在params左右,他們應該只是用他們被稱爲的參數來做事情。你傳遞的是mission_id但不使用它,當參數名稱指示的是要求的ID時,你也會用(顯然)mission對象調用它。另外,你不需要在助手中混淆實例變量,只需簡單的舊變量就可以了。

調整接口要求一個任務對象,然後使用該對象:

def author_of(mission) 
    mission.author.present?? mission.author : mission.syllabus.author 
end 

或者,由於mission.authornil或那裏,你可以採取的nil的虛假的優勢:

def author_of(mission) 
    mission.author || mission.syllabus.author 
end 

然後在您的ERB:

<!-- Note that you should use the plural @missions for a collection, you'll have to fix your controller as well. --> 
<% @missions.each do |mission| %> 
    <%= author_of(mission).username %> 
<% end %> 

當然,一旦我們簡化並糾正了你的幫手,你可能會認爲它太小而不值得打擾;如果是這樣,那麼你可以拋棄的助手,做這一切在ERB:

<% @mission.each do |mission| %> 
    <%= (mission.author || mission.syllabus.author).username %> 
<% end %> 

不過,我認爲你在錯誤的地方這樣的邏輯:這應該是裏面特派團本身讓一切(其他型號,JSON建築商......)可以利用它。所以,這樣的方法是有意義:

class Mission 
    def real_author 
    author || syllabus.author 
    end 
end 

那麼您可以在您的ERB這樣說:

<% @missions.each do |mission| %> 
    <%= mission.real_author.username %> 
<% end %> 
+0

非常感謝!這現在非常有意義! :) :)我真的不知道我如何表達我現在感覺的快樂和感激! – kibaekr

+0

還有1個問題:當我使用'mission.real_author'時,我想將其存儲爲'@author = mission.real_author',我將在何處定義@author變量?我是否必須在.each do循環中完成它,或者我可以以某種方式在控制器中定義它? – kibaekr

+0

@KeithRyu:當你有'@ missions'時,你想在迭代中使用'<%author = mission.real_author%>',這樣'author'就不會泄漏出去並在別處造成麻煩。 –

0

除非我誤解了您的問題,否則您可以在循環中執行此操作而不使用查找。

//view 
<% @mission.each do |mission| %> 
    <%= mission.author.username %> 
<% end %> 

請記住,您正在遍歷所有任務對象。一旦你有一個任務對象,你可以像平常一樣訪問作者。

+0

好了,問題是有些任務沒有作者,在該情況下,它被創建爲教學大綱的嵌套字段。在這種情況下,它應該是mission.syllabus.username,所以我想要邏輯。 – kibaekr

+0

這很讓人困惑,但本質上用戶可以自己創建任務,或者創建一個教學大綱並在其中嵌入許多嵌入的任務。如果特派團是單獨創建的,'mission.author'將會工作並且是首選,但是在它被創建爲一個教學大綱的情況下,'mission.syllabus.author'將需要成爲案例。後來,我做到了這樣,即使它是作爲教學大綱創建的,它也會將作者參數傳遞給任務作者,但是仍然有很多沒有作者的任務 – kibaekr

相關問題