Rails 3を使用すると、モデル内でlink_toヘルパー、またはそのヘルパーを使用する方法がありますか?Modelクラスのヘルパーlink_toを表示
答えて
モデルにlink_toが必要な理由がいくつかあります。はい、@andy、それはMVCの違反ですが、それはあなたが質問に答えるためのポイントを取得する必要があるわけではありません。
@schwabsauce、それよりも簡単です。最初の行は、イニシャライザなどで行う場合には厳密には必要ありません。同じことが.sanitizeと.rawで機能し、他のすばらしい機能が満載です。
ActionView::Base.send(:include, Rails.application.routes.url_helpers)
ActionController::Base.helpers.link_to(whatever)
あなたがあなたのlink_toの内側にこれを実行する必要がありautopathsを使用する場合:
Rails.application.routes.url_helpers.page_path(@page)
ハッカーなし。
link_to
がモデルに必要と思われる場合は、おそらくModel-View-Controller architectureの原理に違反している可能性があります。
モデルはデータとビジネスロジックの場所でなければなりませんが、リンクを生成することはコントローラやビュー(または、ヘルパークラスのRails)の仕事であることはほぼ確実です。
ありがとう。ヘルパーを表示するように移動しました。すべてはすぐに収まります。 – Krule
モデルでヘルパーを使用するのは十分な理由があります。しかし、もっと重要なことに、あなたがそれを考え抜いた場合に備えて、少なくともソリューションを提供するという意見を述べようとするならば。 2Kの担当者が頭をまっすぐにしている可能性があります。 –
私は、以下の介在物で動作するように、この得た:
include ActionView::Helpers::UrlHelper
include ActionController::UrlFor
include Rails.application.routes.url_helpers
cattr_accessor :controller
def controller; self.class.controller; end
def request; controller.request; end
その後、私のコントローラで、私は属性を埋め(ゼロからコントローラを作成するには、ハッシュ引数に大量のデータが必要です)。
Lead.controller = self
のために、Railsのドキュメントはこのソリューションへの道を進んでいます。 ActionDispatch :: Routing :: UrlForのドキュメントでは、ヒント:モデルや他の場所からURLを生成する必要がある場合、ActionController :: UrlForが探しているものです。そのファイルをインクルードすると、エラーメッセージとして表示されます。「#url_forを使用するには、ルーティングヘルパーを明示的にインクルードする必要があります」「たとえばRails.application.routes.url_helpersを含める」 場合によってはリンクを生成する最良の方法/最適な場所です: – schwabsauce
たとえば、モデルがサードパーティのオフサイトゲートウェイへの支払い承認を処理していて、返品/キャンセルURLを生成する必要がある場合アプリに戻ります。 – hoffmanc
はあなたがRailsの3.2でこれをやっている場合は、チャックの記事で概説したアドバイス、以下の非常に注意してください。 1。このアプローチは、Rails 3.2.1の非ビュークラスのlink_toヘルパーを含めて安全な方法ではないように見えます。下記に概説するより安全な方法(いずれにしても私たちのために働く)があります。
私たちが私たちのクラスの1つでChuckの投稿でアプローチを使用したとき、結果は非常に困惑し、結果をデバッグするのが難しくなりました。それは非常に特殊な(そしてまれな)状況でしか見られなかった副作用/バグを引き起こしました。
問題、限り我々が言うことができるように、この行されていること:
ActionView::Base.send(:include, Rails.application.routes.url_helpers)
はActionView::Base
は明らかにすでに独自に行いRails.application.routes.url_helpers
を含むようにActionView::Base
を語っています。 url_helpers
を2度追加すると、ルート状態(ActionDispatch :: Routing :: UrlForモジュールを含むクラスの@_routes)が再初期化されるようです。 url_helpers
二度目含めた直接または間接的に、呼び出そうとするビューで例外、ActionView::Base
後なurl_for方法:
これは一見ランダムと原因不明の「NilClass nilのための 『なurl_for』未定義のメソッド」につながります。
にurl_helpers
を再度記載する代わりに、UrlHelper
モジュールを自分で含めてください。
次にあなたが(と仮定login_pathアプリに対して有効である)のlink_toを使用すると、あなたは、単にこれを行うことができますパスへのアクセス権を持っている必要がある場合:
include ActionView::Helpers::UrlHelper
...
link = link_to('here', Rails.application.routes.url_helpers.login_path)
それは私たちに非常に長い時間がかかったし、非常に多く二重インクルードによって引き起こされたバグを追跡するためのヘッドスクラッチを作成しました.Railsの基本クラスの振る舞いを微調整するときに注意するように他の人に警告したかっただけです。
のlink_toヘルパー、アンディは言っMVC違反
、
あなたはおそらく、あなたがやって、なぜしているもので、大きくて長い見てみる必要があるモデルでHTMLを生成している場合。
URLヘルパーあなたならば、多くの場合であってもモデルで、サービス/フォーム/ APIのすべての種類/ ...例えばクラスでは、ビュー・コントローラのコードの便利な外に来る一方
のURLする必要がある。
はい、Rails.application.routes.url_helpersはモジュールですが、ゲイリーはそれを置くとして、それはあなただけのどこか面白いものを含まなければならないという意味ではありませんが起こって起動します:
https://www.destroyallsoftware.com/blog/2011/one-base-class-to-rule-them-all
何を行うことができます、あなたは次のとおりです。
delegate :url_helpers, :to => 'Rails.application.routes'
してから使用し、例えば
url_helpers.home_url
- 1. link_to img_tagヘルパーを使用すると、レール3に「(/)」と表示されるのはなぜですか?
- 2. link_toヘルパーのモデルにパラメータを割り当てる場合
- 3. Rails HAMLヘルパーがリストアイテムを表示する
- 4. link_toヘルパー内にhamlタグを入れよう
- 5. link_toヘルパー(Rails)内にイメージとテキストを配置する?
- 6. link_to Ajaxでヘルパーが.js.erbファイルにリンクする
- 7. 広告申込情報の合計額を表示するヘルパーを表示
- 8. Rails link_toクラスとidの割り当て
- 9. ItemsControl.ItemTemplateからModelプロパティを表示するためのバインド
- 10. クラスを表示/非表示にする
- 11. 非表示クラスからUIAlertViewを表示
- 12. Javascriptの表示/非表示クラス問題
- 13. ヘルパーを表示:ブール値がfalseの場合はclassBinding
- 14. クラスのステータスを表示
- 15. ImageViewのクラスを表示
- 16. Rails、link_toヘルパーをクリックした後にJavaScriptが読み込まれない
- 17. Modelクラスの重複値のチェック
- 18. django-model unicode()は、外部キーオブジェクト属性を表示します。
- 19. ハンドルバーのヘルパー出力がテンプレートに表示されない
- 20. クラス図でアクセスレベルを表示
- 21. Spring/MVC webappのControllerクラスとModel Javaクラスの命名規則?
- 22. 来るjarクラスの表示
- 23. inbulitクラスの表示方法
- 24. のlink_to
- 25. Flask-Restful-Swagger Modelクラス(リストフィールド付き)
- 26. 同じクラスのdivを表示/非表示
- 27. クラス機能を表示するツールバーを非表示
- 28. AngularJS:ng-clickでのクラスの表示と非表示
- 29. 同じクラスの複数の表示/非表示
- 30. PHP:クラス表示エラー関数
この質問はもう少し前に聞かれましたが、その時点で@ andyのアドバイスが私にこの問題を解決する助けとなりました。しかし、実際の質問には答えられないという意味で正しいです。 – Krule