假设我有一个名为 Thing 的 Rails 模型。Thing 有一个 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(与外部系统集成等)的情况。