Ruby on rails 如何在Rails中从控制器混入并调用link_?

Ruby on rails 如何在Rails中从控制器混入并调用link_?,ruby-on-rails,helpers,actionview,link-to,mixins,Ruby On Rails,Helpers,Actionview,Link To,Mixins,这似乎是一个很难回答的问题,但简单的答案让我难以回答。我需要在ActionController方法中调用link\u to,弹出一个HTML链接ActionView::Helpers::UrlHelper.link_指向调用的url_,但这会调用AV模块的版本,而不是控制器的版本。我设法强迫他做我想做的事 #FIXME there must be a better way to mixin link_to alias_method :self_url_for, :url_for in

这似乎是一个很难回答的问题,但简单的答案让我难以回答。我需要在
ActionController
方法中调用
link\u to
,弹出一个HTML链接
ActionView::Helpers::UrlHelper.link_指向
调用的url_,但这会调用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
在控制器中。但是,我仍然不确定它到底为什么有效。有人能解释一下这里发生的方法范围和隐藏吗?有什么更好的方法可以将
链接到
(或者通常只包括模块中的一些方法),这样我就可以在控制器中调用它(生成带有链接的闪存字符串是用例)


请不要讲MVC——如果有什么的话,
link\u到
应该在与
url\u分开的模块中。从这方面的噪音来看,很多人都遇到了这个看似微不足道的问题,最终用“Rails方式”浪费了一个小时,而真正需要的是一分钟的破解,让我的应用程序现在就可以工作。是否有一种“Rails方式”可以与助手一起实现这一点?或者更好的ruby方式?

这并不能真正回答您的问题,但有一种更简单的方式

对于Rails 5,使用代理

对于Rails 3和4,由于您使用的是来自控制器的帮助器,因此可以使用视图上下文

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

# instead of using your mixin code 
link_to '...', '...'
对于Rails 2,由于您使用的是来自控制器的helper,因此实际上可以访问控制器的@template成员变量,@template就是视图,并且已经混合了UrlHelper

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

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

如果您需要从控制器以外的代码中使用urlhelper,您的解决方案可能就是这样做的

您可以这样做:

ActionController.helpers.link_to("Click Me!", awesome_path)
但实际上,生成该链接的更好位置可能是在已经包含UrlHelper和其他与视图相关的helper的helper模块中

[更新]


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

我在使用自己的助手方法时仍然遇到问题,这些方法在带有ActionController.helper.my_方法的控制器中使用内置的助手方法

显然,为每个flash使用render_to_字符串是可行的,但我不想为每个flash创建这么多小的片段

我的解决方案是为控制器创建一个小助手,以部分方式执行代码

控制器中的帮助器方法:

def h(&block)
  render_to_string(:partial => 'helper', :locals => {:block => block})
end
HAML部分(helper.html.HAML):

在ERB(helper.html.ERB)中也同样适用:


与导轨3、4和5兼容:

view_context.link_to

我在阅读本博客()时使用了
self.class.helpers.link_to
,但是“ActionController.helpers.link_to”应该是一样的。
ActionController:Module的未定义方法“helpers”:Module
@Rails 3.2如果这个答案不再有效,可能应该删除它,或者至少包括它使用的Rails的最新版本号。
ActionController:Module的未定义方法“helpers”:Module
@Rails 5。2@template在我的控制器中为零。知道为什么吗?@TylerCollier-也许rails 3改变了这一点?它在2上起作用,现在应该标记为正确答案。它也与Rails 4兼容,那么html_对这种结构的安全性呢?你能回答这个问题吗?谢谢:)这太过分了。
= instance_eval &block 
<%= instance_eval &block %>
redirect_to url, :notice => h{my_custom_helper_function}
view_context.link_to