如何从 ApplicationHelper 调用 ApplicationController 方法
Posted
技术标签:
【中文标题】如何从 ApplicationHelper 调用 ApplicationController 方法【英文标题】:How to call ApplicationController methods from ApplicationHelper 【发布时间】:2011-05-12 23:37:49 【问题描述】:我想在视图中提供 csv 链接,并将 csv 生成代码放在 ApplicationHelper
中。但是我收到了这个错误:
undefined method `send_data' for #<#<Class:0x0000010151c708>:0x0000010151a070>
引用这个:
send_data content, :type => "text/plain",
:filename => filename,
:disposition => 'attachment'
如果我将 csv 代码放在控制器中,它可以正常工作。我希望使用帮助程序来避免必须为我想为其提供 csv 选项的每个控制器定义路由(我有一堆)。我怎样才能让助手可以使用send_data
(和其他必要的方法)?
【问题讨论】:
未经测试的想法:检查它被调用的类名。将方法重命名为其他方法是否有帮助(可能 send_data 是 rails 已经定义的方法?) 是的,它是一个 Rails 定义的方法,但它似乎只能通过控制器访问。 【参考方案1】:使用helper_method
。
默认情况下,ApplicationController
中的方法只能在控制器内部访问。
向ApplicationController
添加一个方法,并使用helper_method
将其公开为辅助方法:
class ApplicationController < ActionController::Base
helper_method :foo
def foo
"bar"
end
end
现在foo
方法对于控制器和视图都可以访问。
【讨论】:
我认为小狗图标让我为你投票。如此聪明的哈里什!【参考方案2】:如果问题是让 ApplicationHelper 中的方法在所有控制器中都可用,为什么不添加一行
包括 ApplicationHelper到 ApplicationController 文件?
【讨论】:
以上是关于如何从 ApplicationHelper 调用 ApplicationController 方法的主要内容,如果未能解决你的问题,请参考以下文章
Rails & Redcarpet:在 ApplicationHelper 中使用时未初始化的常量 Redcarpet::Render