44

有谁知道我为什么得到

undefined method `my_method' for #<MyController:0x1043a7410>

当我从我的 ApplicationController 子类中调用 my_method("string") 时?我的控制器看起来像

class MyController < ApplicationController
  def show
    @value = my_method(params[:string])
  end
end

和我的帮手

module ApplicationHelper
  def my_method(string)
    return string
  end
end

最后,ApplicationController

class ApplicationController < ActionController::Base
  after_filter :set_content_type
  helper :all
  helper_method :current_user_session, :current_user
  filter_parameter_logging :password
  protect_from_forgery # See ActionController::RequestForgeryProtection for details
4

12 回答 12

61

您不能从控制器调用助手。ApplicationController如果需要在多个控制器中使用,最好的办法是创建方法。

编辑:明确地说,我认为很多混乱(如果我错了,请纠正我)源于helper :all电话。helper :all实际上只包括在视图端的任何控制器下使用的所有助手。在更早的 Rails 版本中,助手的命名空间决定了哪些控制器的视图可以使用助手。

我希望这有帮助。

于 2010-03-05T18:13:35.700 回答
34

view_context 是你的朋友,http: //apidock.com/rails/AbstractController/Rendering/view_context

如果您想在控制器和视图之间共享方法,您还有更多选择:

于 2011-06-17T16:00:55.180 回答
30

在 application_controller.rb 文件中包含 ApplicationHelper,如下所示:

class ApplicationController < ActionController::Base
  protect_from_forgery       
  include ApplicationHelper  
end

这样,在 application_helper.rb 文件中定义的所有方法都将在控制器中可用。

您还可以在单​​个控制器中包含单个助手。

于 2011-05-25T23:58:06.607 回答
7

也许我错了,但帮助者不只是为了观点吗?通常,如果您需要控制器中的函数,则将其放入 ApplicationController 中,因为其子类中的每个函数都可用。

于 2010-03-05T18:16:02.543 回答
6

正如gamecreature这篇文章中所说:

  • 在 Rails 2 中使用@template变量。
  • 在 Rails 3 中使用控制器方法view_context
于 2012-01-23T10:23:56.857 回答
4

助手用于视图,但添加一行代码以在 ApplicationController.rb 中包含该助手文件可以解决您的问题。在您的情况下,在 ApplicationController.rb 中插入以下行:

include ApplicationHelper
于 2011-09-21T10:29:50.703 回答
3

据我所知,helper :all使助手在视图中可用...

于 2010-03-05T18:18:47.000 回答
3

尝试module_function(*instance_methods)在您的帮助模块中附加,之后您可以直接在模块本身上调用这些方法。

于 2014-07-01T08:45:43.037 回答
1

尽管在控制器中调用助手不是一个好习惯,因为助手是在视图中使用的,在控制器中使用助手的最佳方法是在 application_controller 中创建一个助手方法并将它们调用到控制器,
但即使它是必需的在控制器中调用助手
然后只需将助手包含在控制器中

class ControllerName < ApplicationController
  include HelperName
  ...callback statements..

并将辅助方法直接调用到控制器

 module OffersHelper
  def generate_qr_code(text)
    require 'barby'
    require 'barby/barcode'
    require 'barby/barcode/qr_code'
    require 'barby/outputter/png_outputter'
    barcode = Barby::QrCode.new(text, level: :q, size: 5)
    base64_output = Base64.encode64(barcode.to_png({ xdim: 5 }))
    "data:image/png;base64,#{base64_output}"
  end

控制器

class ControllerName < ApplicationController
include OffersHelper

def new
  generate_qr_code('Example Text')
end
end

希望这可以帮助 !

于 2017-03-24T06:48:01.327 回答
0

我有同样的问题...

您可以绕过它,将该逻辑放入模型中,或专门为它创建一个类。与那些讨厌的辅助方法不同,控制器可以访问模型。

这是我的“rag.rb”模型

class Rag < ActiveRecord::Base
  belongs_to :report
  def miaow()
    cat = "catattack"
  end  
end

这是我的“rags_controller.rb”控制器的一部分

def update
  @rag = Rag.find(params[:id])
  puts @rag.miaow()
  ...

在我单击“更新”后,这对终端造成了攻击。

给定一个实例,可以调用模型中的方法。用一些代码替换 catattack。(这是我目前最好的)

:helper all 只打开视图的助手。

这显示了如何创建一个类并调用它。 http://railscasts.com/episodes/101-refactoring-out-helper-object?autoplay=true

于 2011-07-28T16:58:09.770 回答
0

试试这个直接从你的控制器访问帮助函数view_context.helper_name

于 2015-05-18T13:31:34.217 回答
0

您可以使用helper关键字语法将辅助方法包含到控制器中

class MyController < ApplicationController
  helper ApplicationHelper

end
于 2021-02-15T00:52:27.907 回答