假设我有一个叫Thing的Rails模型。Thing有一个url属性,可以选择将其设置为Internet上某个地方的url。在视图代码中,我需要这样做的逻辑:
<% if thing.url.blank? %>
<%= link_to('Text', thing_path(thing)) %>
<% else %>
<%= link_to('Text', thing.url) %>
<% end %>
视图中的条件逻辑是丑陋的。当然,我可以构建一个helper函数,它会将视图更改为:
<%= thing_link('Text', thing) %>
这解决了冗长的问题,但我更喜欢在模型本身中拥有功能。在这种情况下,视图代码将是:
<%= link_to('Text', thing.link) %>
这显然需要模型上的链接方法。以下是它需要包含的内容:
def link
(self.url.blank?) ? thing_path(self) : self.url
end
就问题而言,thing_path()在Model代码中是一个未定义的方法。我假设可以将一些辅助方法“拉入”到模型中,但是怎么做呢?路由只在应用程序的控制器和视图层运行,这有什么真正的原因吗?我能想到很多模型代码可能需要处理url的情况(与外部系统集成等)。