59

これは初心者の質問のように思えますが、簡単な答えは私にはわかりません。HTMLリンクを吐き出すメソッド を呼び出す必要がありlink_toます。を呼び出しますが、これはコントローラーのバージョンではなく、AVモジュールのバージョンを呼び出します。私はこれを私が意図したことをするように強制することができましたActionControllerActionView::Helpers::UrlHelper.link_tourl_for

  #FIXME there must be a better way to mixin link_to
  alias_method :self_url_for, :url_for
  include ActionView::Helpers::UrlHelper
  alias_method :url_for, :self_url_for

コントローラーで。しかし、なぜそれが正確に機能するのかはまだわかりません。誰かがメソッドのスコープとここで起こっていることを隠すことを説明してもらえますか?link_toコントローラで呼び出すことができるように(または一般的に、モジュールからの一部のメソッドのみを含めるために)混合するためのより良い方法は何ですか(リンクを使用してフラッシュ文字列を生成することがユースケースです)。

MVCについての講義はしないでください。どちらかといえば、link_toとは別のモジュールで行う必要がありますurl_for。これに関するノイズの量から判断すると、多くの人がこの一見些細な問題に遭遇し、アプリを機能させるための1分間のハックが本当に必要なときに、「Railsway」で1時間を無駄にすることになります。おそらくヘルパーとこれを行うための「レールの方法」はありますか?またはより良いルビーの方法?

4

4 に答える 4

118

Rails 3,4および5と互換性があります:

view_context.link_to
于 2012-06-19T12:45:29.667 に答える
71

これは実際にはあなたの質問に答えませんが、もっと簡単な方法があります

Rails 5helpersの場合、プロキシを使用します

helpers.link_to '...', '...'

Rails 3および4の場合、コントローラーからヘルパーを使用しているため、view_contextを使用できます。

# in the controller code
view_context.link_to '...', '...'

# instead of using your mixin code 
link_to '...', '...'

Rails 2の場合、コントローラーからヘルパーを使用しているため、コントローラーの@templateメンバー変数に実際にアクセスできます。@ templateはビューであり、すでにUrlHelperが混在しています。

# in the controller code
@template.link_to '...', '...'

# instead of using your mixin code 
link_to '...', '...'

コントローラ以外のコードからurlhelperを使用する必要がある場合は、おそらくソリューションが最適です。

于 2010-10-01T23:27:46.720 に答える
1

あなたはこのようにそれを行うことができます:

ActionController.helpers.link_to("Click Me!", awesome_path)

しかし実際には、そのリンクを生成するためのより良い場所は、UrlHelperおよびその他のビュー関連のヘルパーがすでに含まれているヘルパーモジュールにある可能性があります。

[アップデート]

このアプローチは時代遅れであり、もはや機能しません。

于 2011-05-18T13:33:24.717 に答える
0

ActionController.helper.my_methodを使用して、コントローラーに組み込まれているヘルパーメソッドを使用する独自のヘルパーメソッドを使用しても問題が発生しました。

明らかに、各フラッシュにrender_to_stringを使用することは機能しますが、各フラッシュにそれほど多くの小さなパーシャルを作成したくありません。

私の解決策は、コントローラーがコードを部分的に実行するための小さなヘルパーを作成することでした。

コントローラのヘルパーメソッド:

def h(&block)
  render_to_string(:partial => 'helper', :locals => {:block => block})
end

HAMLパーシャル(helper.html.haml):

= instance_eval &block 

同じことがERB(helper.html.erb)でも機能します。

<%= instance_eval &block %>

コントローラで次のように使用して、ヘルパーで定義されているmy_custom_helper_functionを呼び出します。

redirect_to url, :notice => h{my_custom_helper_function}
于 2012-01-13T11:32:26.967 に答える