たとえば、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")