假设我有一个名为Thing的Rails模型。事物具有url属性,可以选择将其设置为Internet上某个地方的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(与外部系统集成)。