59

这似乎是一个菜鸟问题,但简单的答案让我望而却步。我需要调用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(或者通常只包含来自模块的一些方法),这样我就可以在控制器中调用它(用链接生成闪存字符串是用例。)

拜托,没有关于 MVC 的讲座——如果有的话,link_to应该在与url_for. 从这方面的噪音来看,很多人遇到了这个看似微不足道的障碍,最终浪费了一个小时以“Rails 方式”进行,而真正想要的是让我的应用程序现在运行的一分钟破解。也许有一种“Rails 方式”可以用助手来做到这一点?还是更好的红宝石方式?

4

4 回答 4

118

与 Rails 3,4 和 5 兼容:

view_context.link_to
于 2012-06-19T12:45:29.667 回答
71

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

对于 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

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

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

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

于 2010-10-01T23:27:46.720 回答
1

你可以这样做:

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

但实际上,生成该链接的更好位置可能是在已经包含 UrlHelper 和其他与视图相关的帮助器的帮助器模块中。

[更新]

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

于 2011-05-18T13:33:24.717 回答
0

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

显然,为每个 flash 使用 render_to_string 是可行的,但我不想为每个 flash 创建这么多的小部分。

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

控制器中的辅助方法:

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

HAML 部分(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}
于 2012-01-13T11:32:26.967 回答