说我有东西叫一个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(与外部系统的集成等)案件。
在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)
返回一些其他网址。
您还可能会发现以下方法清洁不是包括所有的方法:
class Thing
delegate :url_helpers, to: 'Rails.application.routes'
def url
url_helpers.thing_path(self)
end
end
具有与显示在视图中做任何逻辑应该委托给一个辅助方法,如在该模型的方法是严格地处理数据。
这里是你可以做什么:
# 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) %>
我真的很喜欢干净之后解决。
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/
虽然有可能是一种方式,我会倾向于保持那种逻辑的缩小模型。 我同意,你不应该把在视图中( 保持它的瘦 ),但除非该模型返回一个URL作为一个数据的控制器,路由东西应该是在控制器中。
(编辑:忘了我以前的潺潺......)
好吧,可能有情况下,您会去任何模型或一些其他网址...但我真的不认为这属于模型,视图(或者模型)听起来更apropriate。
关于路线,据我所知道的路线是在控制器的操作(通常至极“神奇地”使用的视图),不是直接的看法。 控制器应处理所有的请求,认为应该将结果呈现和模型应该处理的数据,并将其用于视图或控制器。 我听说有很多人在这里谈论路线模型(给点我的allmost开始beleave),但我的理解是:路线去控制器。 当然有很多控制器是一个模型控制器和通常被称为<modelname>sController
(例如“UsersController”是模型“用户”的控制器)。
如果你发现自己在一个视图讨厌写作的逻辑资源,尽量某处更合适的移动逻辑; 请求和内部通信逻辑可能属于在控制器,相关的逻辑数据可以被放置在模型中(但不显示逻辑,其包括链接标记等)和逻辑纯粹是显示有关将被放置在一个帮手。
文章来源: Can Rails Routing Helpers (i.e. mymodel_path(model)) be Used in Models?