如何从 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

PHP面向对象之前端控制器模式

消息闪现

清理 HTML 并关闭不完整的标签

如何从Android调用javascript?

如何从 GTK+2 C 代码中调用 matlab/octave 函数