如何从 Rails 中的控制器混入和调用 link_to?
Posted
技术标签:
【中文标题】如何从 Rails 中的控制器混入和调用 link_to?【英文标题】:How to mixin and call link_to from controller in Rails? 【发布时间】:2011-04-20 02:25:04 【问题描述】:这似乎是一个菜鸟问题,但简单的答案却让我望而却步。我需要在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
(或者通常只包含来自模块的一些方法),这样我就可以在控制器中调用它(用链接生成一个闪存字符串是用例。)
请不要讲关于 MVC 的讲座——如果有的话,link_to
应该在与 url_for
分开的模块中。从这方面的噪音来看,很多人遇到了这个看似微不足道的障碍,最终浪费了一个小时以“Rails 方式”进行,而真正想要的是让我的应用程序现在运行的一分钟破解。也许有一种“Rails 方式”可以用助手来做到这一点?还是更好的红宝石方式?
【问题讨论】:
【参考方案1】:这并不能真正回答您的问题,但有一种更简单的方法
对于 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,您的解决方案可能是可行的方法
【讨论】:
@template 在我的控制器中对我来说是零。知道为什么吗? @TylerCollier - 也许这已经随着 rails 3 改变了?它在 2 上工作【参考方案2】:你可以这样做:
ActionController.helpers.link_to("Click Me!", awesome_path)
但实际上,生成该链接的更好位置可能是在已经包含 UrlHelper 和其他与视图相关的帮助器的帮助器模块中。
[更新]
这种方法已经过时,不再有效。
【讨论】:
我在阅读这篇博客时使用了self.class.helpers.link_to
(blog.lrdesign.com/2009/05/…),但 'ActionController.helpers.link_to' 应该是一样的。
undefined method 'helpers' for ActionController:Module
@Rails 3.2
如果这个答案不再有效,它可能应该被删除,或者至少包括它工作的 Rails 的最后一个版本号。
undefined method 'helpers' for ActionController:Module
@Rails 5.2【参考方案3】:
我在使用我自己的辅助方法时仍然遇到问题,这些辅助方法在带有 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 => hmy_custom_helper_function
【讨论】:
这是想多了。【参考方案4】:与 Rails 3,4 和 5 兼容:
view_context.link_to
【讨论】:
现在应该标记为正确答案。它也与 Rails 4 兼容 这个结构的 html_safe 怎么样?你能为此提供答案吗?谢谢:)以上是关于如何从 Rails 中的控制器混入和调用 link_to?的主要内容,如果未能解决你的问题,请参考以下文章
从 Rails 中的控制器调用辅助方法时出现“未定义的方法”