Kru*_*ule 45 ruby-on-rails ruby-on-rails-3
使用Rails 3,有没有办法在模型中使用link_to helper或任何帮助器?
Chu*_*ose 80
您可能需要在模型中使用link_to.是的,@ andy,这是对MVC的违反,但这并不意味着你应该得到积分而不回答这个问题.
@schwabsauce,比这更容易.如果你在初始化器或其他东西中执行它,那么第一行甚至不是必需的.同样适用于.sanitize和.raw以及其他很棒的其他功能.
ActionView::Base.send(:include, Rails.application.routes.url_helpers)
ActionController::Base.helpers.link_to(whatever)
Run Code Online (Sandbox Code Playgroud)
如果你想使用autopaths,你可能必须在link_to中执行此操作:
Rails.application.routes.url_helpers.page_path(@page)
Run Code Online (Sandbox Code Playgroud)
小智 31
如果你在Rails 3.2.1中这样做,请按照Chuck的帖子中提出的建议非常小心.看起来这种方法似乎不是一种安全的方法,可以在Rails 3.2.1中的非视图类中包含link_to帮助器.下面概述了一种更安全的方式(在任何情况下都适用于我们).
当我们在我们的一个课程中使用Chuck的帖子中的方法时,它最终会产生非常麻烦且难以调试的后果.它最终造成了副作用/错误,这些副作用/错误只出现在非常特殊(和罕见)的情况下.
据我们所知,问题在于这一行:
ActionView::Base.send(:include, Rails.application.routes.url_helpers)
Run Code Online (Sandbox Code Playgroud)
告诉ActionView::Base要包括Rails.application.routes.url_helpers,ActionView::Base显然已经自己做了.让它包含url_helpers第二次,似乎导致路由状态的重新初始化(包含ActionDispatch :: Routing :: UrlFor模块的类中的@_routes).
这导致看似随机且无法解释的"未定义的方法'url_for'用于nil:NilClass"异常在视图中尝试直接或间接调用url_for方法之后 ActionView::Base包含url_helpers第二次.
对我们有用的解决方案不是告诉ActionView::Base我url_helpers再次包含,只需UrlHelper在您需要的地方自己包含模块.
然后,当您需要使用link_to并且可以访问该路径时,您可以简单地执行此操作(假设login_path对您的应用程序有效):
include ActionView::Helpers::UrlHelper
...
link = link_to('here', Rails.application.routes.url_helpers.login_path)
Run Code Online (Sandbox Code Playgroud)
它花了我们很长时间,并且为了追踪由双重包含引起的错误而进行了大量工作,我只想在调整Rails基类的行为时警告其他人要小心.
我得到了这个包含以下内容:
include ActionView::Helpers::UrlHelper
include ActionController::UrlFor
include Rails.application.routes.url_helpers
cattr_accessor :controller
def controller; self.class.controller; end
def request; controller.request; end
Run Code Online (Sandbox Code Playgroud)
然后在我的控制器中我填充了属性(从头开始创建一个控制器需要在参数哈希中有大量数据).
Lead.controller = self
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28170 次 |
| 最近记录: |