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

时间:2010-10-01 22:49:31

标签: ruby-on-rails helpers actionview link-to mixins

这似乎是一个菜鸟问题,但简单的答案是在逃避我。我需要在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

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

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

4 个答案:

答案 0 :(得分:113)

与Rails 3,4和5兼容:

view_context.link_to

答案 1 :(得分:59)

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

对于Rails 5 ,请使用helpers代理

helpers.link_to '...', '...'

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

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

# instead of using your mixin code 
link_to '...', '...'

对于Rails 2 ,由于您正在使用控制器中的帮助程序,您实际上可以访问控制器的@template成员变量,因此@template是视图,并且已将UrlHelper混合在< / p>

# in the controller code
@template.link_to '...', '...'

# instead of using your mixin code 
link_to '...', '...'

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

答案 2 :(得分:1)

你可以这样做:

ActionController.helpers.link_to("Click Me!", awesome_path)

但实际上,生成该链接的更好地方可能是帮助模块,其中已包含UrlHelper和其他与视图相关的帮助程序。

<强> [更新]

这种方法已经过时,不再有效。

答案 3 :(得分:0)

在使用ActionController.helper.my_method的控制器中使用自己的辅助方法时,我仍然遇到问题。

显然,每个闪存使用render_to_string都可以,但我不想为每个闪存创建这么多的小部分。

我的解决方案是为控制器创建一个小帮手来执行部分代码。

控制器中的辅助方法:

def h(&block)
  render_to_string(:partial => 'helper', :locals => {:block => block})
end

HAML partial(helper.html.haml):

= instance_eval &block 

同样适用于ERB(helper.html.erb):

<%= instance_eval &block %>

在你的控制器中使用它来调用帮助器中定义的my_custom_helper_function:

redirect_to url, :notice => h{my_custom_helper_function}