【发布时间】:2010-09-25 08:43:57
【问题描述】:
假设我有一个名为 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(与外部系统集成等)的情况。
【问题讨论】:
-
一个用例是:在 aftersave 中从 goo.gl 生成缩短的 url,
-
如果您想添加视图逻辑,您可能应该将模型包装在演示器中,这将使 MVC 层保持分离。请参阅 Draper(github.com/jcasimir/draper)。
-
另请参阅api.rubyonrails.org/classes/ActionDispatch/Routing/UrlFor.html文档中的“命名路由的 URL 生成”部分
标签: ruby-on-rails rails-routing helpermethods