2012-05-11 12 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変数をどこで定義しますか?それぞれのループ内でそれをやらなければならないのでしょうか、それとも何らかの形でコントローラーで定義できますか? – 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

それは混乱しますが、本質的にユーザーはミッションを単独で作成したり、シラバスを作成したり、その中に多数のネストされたミッションを持つことができます。ミッションが別に作成された場合は、「ミッション・オーサー」が機能し、それが望ましいですが、シラバスとして作成された場合は、ミッション・シルラブス・オーソーが必要です。後で、それがシラバスとして作成されたとしても、それは作者のパラムをミッション作家に渡すことになりましたが、まだ作者がいない多くのミッションがあります。 – kibaekr

関連する問題