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) %>
これには、明らかに、モデルに link メソッドが必要です。含める必要があるものは次のとおりです。
def link
(self.url.blank?) ? thing_path(self) : self.url
end
問題の点では、thing_path() は Model コード内の未定義のメソッドです。いくつかのヘルパー メソッドをモデルに「取り込む」ことは可能だと思いますが、どのようにすればよいのでしょうか? また、ルーティングがアプリのコントローラー レイヤーとビュー レイヤーでのみ機能する本当の理由はありますか? モデル コードで URL を処理する必要がある場合 (外部システムとの統合など) はたくさん考えられます。