为了账号安全,请及时绑定邮箱和手机立即绑定

可以在模型中使用Rails路由助手(即mymodel_path(模型))吗?

可以在模型中使用Rails路由助手(即mymodel_path(模型))吗?

米琪卡哇伊 2019-07-29 11:04:14
可以在模型中使用Rails路由助手(即mymodel_path(模型))吗?假设我有一个名为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.urlend就问题而言,thing_path()是Model代码中未定义的方法。我假设可以将一些辅助方法“拉入”模型中,但是如何?是否有一个真正的原因,路由只在控制器上运行并查看应用层?我可以想到许多模型代码可能需要处理URL(与外部系统集成等)的情况。
查看完整描述

3 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

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

对于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。


查看完整回答
反对 回复 2019-07-29
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

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

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

  def url
    url_helpers.thing_path(self)
  endend


查看完整回答
反对 回复 2019-07-29
  • 3 回答
  • 0 关注
  • 614 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信