Aar*_*ell 355 ruby-on-rails rails-routing helpermethods
假设我有一个名为Thing的Rails模型.Thing有一个url属性,可以选择将其设置为Internet上的某个URL.在视图代码中,我需要执行以下操作的逻辑:
<% if thing.url.blank? %>
<%= link_to('Text', thing_path(thing)) %>
<% else %>
<%= link_to('Text', thing.url) %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
视图中的这种条件逻辑很难看.当然,我可以构建一个辅助函数,它会将视图更改为:
<%= thing_link('Text', thing) %>
Run Code Online (Sandbox Code Playgroud)
这解决了冗长问题,但我真的更喜欢模型本身的功能.在这种情况下,视图代码将是:
<%= link_to('Text', thing.link) %>
Run Code Online (Sandbox Code Playgroud)
显然,这需要模型上的链接方法.这是它需要包含的内容:
def link
(self.url.blank?) ? thing_path(self) : self.url
end
Run Code Online (Sandbox Code Playgroud)
就问题而言,thing_path()是Model代码中未定义的方法.我假设可以将一些辅助方法"拉入"模型中,但是如何?是否有一个真正的原因,路由只在控制器上运行并查看应用程序层?我可以想到许多模型代码可能需要处理URL(与外部系统集成等)的情况.
小智 676
在Rails 3,4和5中,您可以使用:
Rails.application.routes.url_helpers
Run Code Online (Sandbox Code Playgroud)
例如
Rails.application.routes.url_helpers.posts_path
Rails.application.routes.url_helpers.posts_url(:host => "example.com")
Run Code Online (Sandbox Code Playgroud)
Aar*_*ell 179
我自己找到了关于如何做到这一点的答案.在模型代码中,只需:
对于Rails <= 2:
include ActionController::UrlWriter
Run Code Online (Sandbox Code Playgroud)
对于Rails 3:
include Rails.application.routes.url_helpers
Run Code Online (Sandbox Code Playgroud)
这奇怪地thing_path(self)
返回当前事物的URL,或other_model_path(self.association_to_other_model)
返回一些其他URL.
mat*_*ins 114
您可能还会发现以下方法比包含每种方法更清晰:
class Thing
delegate :url_helpers, to: 'Rails.application.routes'
def url
url_helpers.thing_path(self)
end
end
Run Code Online (Sandbox Code Playgroud)
Jos*_*man 13
任何与视图中显示的内容有关的逻辑都应该委托给辅助方法,因为模型中的方法严格用于处理数据.
这是你可以做的:
# 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) %>
Run Code Online (Sandbox Code Playgroud)
我真的很喜欢遵循干净的解决方案。
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
Run Code Online (Sandbox Code Playgroud)
它来自http://hawkins.io/2012/03/generating_urls_whenever_and_wherever_you_want/
归档时间: |
|
查看次数: |
152422 次 |
最近记录: |