路径(模型))在模型中使用?

假设我有一个叫做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()是Model代码中未定义的方法。 我假设可以将一些辅助方法“拉进”模型,但是如何? 是否有一个真正的原因,路由只能在应用程序的控制器和视图层进行操作? 我可以想到很多模型代码可能需要处理URL(与外部系统集成等)的情况。


在Rails 3,4和5中,你可以使用:

Rails.application.routes.url_helpers

例如

Rails.application.routes.url_helpers.posts_path
Rails.application.routes.url_helpers.posts_url(:host => "example.com")

我已经找到了自己如何做到这一点的答案。 在模型代码中,只需放入:

对于Rails <= 2:

include ActionController::UrlWriter

对于Rails 3:

include Rails.application.routes.url_helpers

这神奇地使thing_path(self)返回当前事物的URL,或者other_model_path(self.association_to_other_model)返回其他一些URL。


您也可能会发现以下方法比包含每种方法更清晰:

class Thing
  delegate :url_helpers, to: 'Rails.application.routes' 

  def url
    url_helpers.thing_path(self)
  end
end
链接地址: http://www.djcxy.com/p/25811.html

上一篇: path(model)) be Used in Models?

下一篇: Learning Ruby on Rails