Rails ルーティングヘルパー (つまり mymodel_path(model)) をモデルで使用できますか? 質問する

Rails ルーティングヘルパー (つまり mymodel_path(model)) をモデルで使用できますか? 質問する

たとえば、Thing という Rails モデルがあるとします。Thing には、オプションでインターネット上のどこかの URL に設定できる url 属性があります。ビュー コードでは、次の操作を実行するロジックが必要です。

<% if thing.url.blank? %>
<%= link_to('Text', thing_path(thing)) %>
<% else %>
<%= link_to('Text', thing.url) %>
<% end %>

ビュー内のこの条件付きロジックは見苦しいです。もちろん、ヘルパー関数を作成して、ビューを次のように変更することもできます。

<%= thing_link('Text', thing) %>

これで冗長性の問題は解決しますが、モデル自体に機能を持たせる方が望ましいです。その場合、ビュー コードは次のようになります。

<%= link_to('Text', thing.link) %>

当然、これにはモデルにリンク メソッドが必要になります。これには次のものを含める必要があります。

def link
  (self.url.blank?) ? thing_path(self) : self.url
end

質問の要点ですが、thing_path() はモデル コード内の未定義メソッドです。モデルにいくつかのヘルパー メソッドを「取り込む」ことは可能だと思いますが、どのようにすればよいのでしょうか。また、ルーティングがアプリのコントローラー レイヤーとビュー レイヤーでのみ動作する本当の理由はありますか。モデル コードが URL を処理する必要があるケースは多数考えられます (外部システムとの統合など)。

ベストアンサー1

Rails 3以降の場合:

Rails.application.routes.url_helpers

例えば

Rails.application.routes.url_helpers.posts_path
Rails.application.routes.url_helpers.posts_url(:host => "example.com")

おすすめ記事