2017-03-09 6 views
0

現在のコントローラに基づいてブレッドクラムを割り当てるために、アプリケーションコントローラに汎用ブレッドクラムメソッドを作成しようとしています。私は「シング」のインデックスのパン粉を望んでいた場合、私は、ビューに必要があるでしょう:文字列をコントローラメソッド呼び出しに変換する

<%= breadcrumb :things, things %> 

そして編集やショーのために:

物事がその物事コントローラのメソッドである
<%= breadcrumb :thing, thing %> 

すべてのものを返し、そして事が暴露され、関連するthing.Bothを返すメソッドである、と私は自分のアプリケーションのレイアウトを持っている:

<%= breadcrumb crumb, crumb_resource %> 

そして、自分のアプリケーションのコントローラで:

def crumb 
    return controller_name.singularize.to_sym if edit_or_show_action 
    controller_name.to_sym 
end 

def crumb_resource 
    resource = controller_name 
    resource = controller_name.singularize if edit_or_show_action 
end 

def edit_or_show_action 
    action_name == 'edit' || 'show' 
end 

これは明らかに、コントローラメソッドの呼び出しではなく、crumb_resourceの文字列を返します。私が見つけることができるから、それはsendと何か関係があると信じていますが、

明らかに動作しません。コントローラのメソッド呼び出しに返される文字列をどのように変換できますか?

+0

コントローラーメソッドを呼び出す必要がある理由は何ですか?ほとんどの場合、コントローラメソッドはビューを生成するか、ビューからアクセスできるヘルパーメソッドです。一般に、あるコントローラを他のコントローラから呼び出すことは想定されていません。だから、なぜ 'controller.send(resource)'が必要ですか? – Casper

+0

私はリソース文字列を私が探しているオブジェクトに変換する別の方法を知らないので、ビューのオブジェクトにアクセスしている場合は、コントローラコールを使って行うのが最良だと思うが、そのため、私は "リソース"文字列をビュー用のコントローラメソッドに変換しようとしています。私がそれに近づいている場合、またはより良い方法があることを私に教えてください。 – Mark

+0

あなたは何か間違っているかもしれませんが、おそらくそうではありません。私はあなたが期待していることの具体的な例を使ってあなたの答えを編集する必要があると思います。ここで抽象理論を話しています。具体的なものを入れてみましょう。通常、リソースはコントローラではなくモデルから来ますが、おそらくこの場合はもっと巧妙な方法があります。 – Casper

答えて

1

あなたがGretelを使用している場合、私は、あなたが探しているかもしれないが、このだと思う:

def crumb_resource 
    resource = controller_name 
    resource = controller_name.singularize if edit_or_show_action 

    self.instance_variable_get("@#{resource}") 
end 

これあなたがedit/show/index動作中@resource_nameに関連するリソースを格納していると仮定しています。

0

私はしかし、これは私のために働いた末に、私はそれが彼らのビューでモデルをアクセスするために、インスタンス変数を使用している人々のために働くと仮定しているとして与えられた答えを受け入れ:

evalは、文字列を評価し
breadcrumb crumb, eval(crumb_resource) 

、基本的に逆補間はかなりクールに聞こえる。

+0

その場合、あなたが探していたものは 'self.send(resource)'です。 – Casper

+0

そうです!どうもありがとう – Mark

関連する問題