可以Rails的路由助手(即mymodel_path(模型))被模型所用的?可以Rails的路由助手

2019-06-17 10:08发布

说我有东西叫一个Rails模型。 事有可选择性地在互联网上某处设置一个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(与外部系统的集成等)案件。

Answer 1:

在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")


Answer 2:

我发现关于如何做这自己的答案。 里面的型号代码,只是把:

为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)返回一些其他网址。



Answer 3:

您还可能会发现以下方法清洁不是包括所有的方法:

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

  def url
    url_helpers.thing_path(self)
  end
end


Answer 4:

具有与显示在视图中做任何逻辑应该委托给一个辅助方法,如在该模型的方法是严格地处理数据。

这里是你可以做什么:

# In the helper...

def link_to_thing(text, thing)
  (thing.url?) ? link_to(text, thing_path(thing)) : link_to(text, thing.url)
end

# In the view...

<%= link_to_thing("text", @thing) %>


Answer 5:

我真的很喜欢干净之后解决。

class Router
  include Rails.application.routes.url_helpers

  def self.default_url_options
    ActionMailer::Base.default_url_options
  end
end

router = Router.new
router.posts_url  # http://localhost:3000/posts
router.posts_path # /posts

这是一个从http://hawkins.io/2012/03/generating_urls_whenever_and_wherever_you_want/



Answer 6:

虽然有可能是一种方式,我会倾向于保持那种逻辑的缩小模型。 我同意,你不应该把在视图中( 保持它的瘦 ),但除非该模型返回一个URL作为一个数据的控制器,路由东西应该是在控制器中。



Answer 7:

(编辑:忘了我以前的潺潺......)

好吧,可能有情况下,您会去任何模型或一些其他网址...但我真的不认为这属于模型,视图(或者模型)听起来更apropriate。

关于路线,据我所知道的路线是在控制器的操作(通常至极“神奇地”使用的视图),不是直接的看法。 控制器应处理所有的请求,认为应该将结果呈现和模型应该处理的数据,并将其用于视图或控制器。 我听说有很多人在这里谈论路线模型(给点我的allmost开始beleave),但我的理解是:路线去控制器。 当然有很多控制器是一个模型控制器和通常被称为<modelname>sController (例如“UsersController”是模型“用户”的控制器)。

如果你发现自己在一个视图讨厌写作的逻辑资源,尽量某处更合适的移动逻辑; 请求和内部通信逻辑可能属于在控制器,相关的逻辑数据可以被放置在模型中(但不显示逻辑,其包括链接标记等)和逻辑纯粹是显示有关将被放置在一个帮手。



文章来源: Can Rails Routing Helpers (i.e. mymodel_path(model)) be Used in Models?