如何在Rails中混入并从controller中调用link_to?

这似乎是一个noob问题,但简单的答案是逃避我。 我需要在ActionController方法中调用link_to来吐出一个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 (或通常,只包括一些模块的方法),所以我可以在控制器中调用它(生成闪存string与链接是用例。)

请不要关于MVC的讲座 – 如果有的话, link_to应该在与url_for分开的模块中。 从这个噪音的数量来看,很多人遇到了这个看似微不足道的麻烦,最终浪费了一个小时做“Rails的方式”,真正需要的只是一分钟的破解,使我的应用程序现在工作。 有没有一个“Rails的方式”与帮手或许做到这一点? 或者更好的ruby方式?

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

对于Rails 3和4 ,由于您使用的是控制器的帮助器,所以可以使用view_context

 # in the controller code view_context.link_to '...', '...' # instead of using your mixin code link_to '...', '...' 

对于Rails 2来说 ,由于你使用的是控制器的helper,所以你实际上可以访问控制器的@template成员variables,@template就是视图,并且UrlHelper已经混合了

 # in the controller code @template.link_to '...', '...' # instead of using your mixin code link_to '...', '...' 

如果您需要从控制器以外的代码使用urlhelper,那么您的解决scheme可能就是要走的路

与Rails 3和4兼容:

 view_context.link_to 

你可以这样做:

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

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

[更新]

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

我认为最简洁的解决scheme是将文本放入视图中,并使用控制器中的“render_to_string”。

在使用ActionController.helper.my_method的控制器中,我仍然遇到了使用自己的帮助器方法的问题,这些帮助器方法使用内置的帮助器方法。

显然,使用render_to_string为每个闪光将工作,但我不希望为每个闪光创build这么多的小部分。

我的解决scheme是为控制器创build一个小助手来执行部分代码。

控制器中的帮助器方法:

 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 %> 

在你的控制器中像这样使用它来调用helper中定义的my_custom_helper_function:

 redirect_to url, :notice => h{my_custom_helper_function} 
Interesting Posts