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を処理する必要がある場合(外部システムとの統合など)がたくさんあると思います。