如何在Rails中混合并调用link_to来自控制器?

tri*_*bes 51 ruby-on-rails actionview mixins helpers link-to

这似乎是一个菜鸟问题,但简单的答案是在逃避我.我需要调用link_to一个ActionController方法来吐出一个HTML链接. ActionView::Helpers::UrlHelper.link_to调用url_for,但这会调用AV模块的版本而不是控制器的版本.我设法强迫这样做,通过推杆做我想要的

  #FIXME there must be a better way to mixin link_to
  alias_method :self_url_for, :url_for
  include ActionView::Helpers::UrlHelper
  alias_method :url_for, :self_url_for
Run Code Online (Sandbox Code Playgroud)

在控制器中.但是,我仍然不确定它为什么会起作用.有人可以解释方法范围并隐藏这里发生的事情吗?什么是更好的混合方式link_to(或者通常只包括模块中的一些方法),所以我可以在控制器中调用它(生成带有链接的flash字符串就是用例.)

请不要讲MVC - 如果有的话,link_to应该在一个单独的模块中url_for.从噪音的数量来看,很多人遇到这个看似微不足道的障碍,并最终浪费了一个小时做"Rails方式",真正想要的是一分钟黑客让我的应用程序现在工作.是否有"Rails方式"可能与助手一起做这件事?还是更好的红宝石方式?

Yac*_*ani 114

与Rails 3,4和5兼容:

view_context.link_to
Run Code Online (Sandbox Code Playgroud)

  • 现在应该将其标记为正确答案.它也与Rails 4兼容 (7认同)

hou*_*se9 61

这并没有真正回答你的问题,但有一种更简单的方法

对于Rails 3和4,由于您正在使用控制器中的帮助程序,因此可以使用view_context

helpers.link_to '...', '...'
Run Code Online (Sandbox Code Playgroud)

对于Rails 2,由于您正在使用来自控制器的帮助器,您实际上可以访问控制器的@template成员变量,@ template是视图并且已经混合了UrlHelper

# in the controller code
view_context.link_to '...', '...'

# instead of using your mixin code 
link_to '...', '...'
Run Code Online (Sandbox Code Playgroud)

如果您需要使用控制器以外的代码中的urlhelper,那么您的解决方案可能就是您的选择

  • 在我的控制器中@template对我来说是零.知道为什么吗? (5认同)
  • 第3和第4栏的答案已更新 (3认同)