有谁知道我为什么
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
答案 0 :(得分:61)
您无法从控制器调用帮助程序。如果需要在多个控制器中使用,最好的办法是在ApplicationController
中创建方法。
编辑:要清楚,我认为很多困惑(如果我错了,请纠正我)源于helper :all
电话。 helper :all
实际上只包括您在视图端的任何控制器下使用的所有帮助程序。在早期版本的Rails中,帮助程序的命名空间确定了哪些控制器的视图可以使用帮助程序。
我希望这会有所帮助。
答案 1 :(得分:33)
view_context是你的朋友,http://apidock.com/rails/AbstractController/Rendering/view_context
如果你想在控制器和视图之间共享方法,你还有其他选择:
答案 2 :(得分:25)
在application_controller.rb文件中包含ApplicationHelper,如下所示:
class ApplicationController < ActionController::Base
protect_from_forgery
include ApplicationHelper
end
这样,application_helper.rb文件中定义的所有方法都将在控制器中可用。
您还可以在各个控制器中包含个人助手。
答案 3 :(得分:7)
也许我错了,但不仅仅是观点的助手?通常,如果您需要控制器中的函数,则将其放入ApplicationController中,因为它的子类中有可用的每个函数。
答案 4 :(得分:6)
正如gamecreature中的this post所述:
@template
变量。view_context
答案 5 :(得分:4)
帮助程序用于视图,但添加一行代码以在ApplicationController.rb中包含该帮助程序文件可以解决您的问题。在您的情况下,在ApplicationController.rb中插入以下行:
include ApplicationHelper
答案 6 :(得分:3)
据我所知,helper :all
在视图中提供助手......
答案 7 :(得分:3)
尝试在帮助程序模块中附加module_function(*instance_methods)
,之后您可以直接在模块上调用这些方法。
答案 8 :(得分: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
希望这有帮助!
答案 9 :(得分: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
答案 10 :(得分:0)
尝试此操作直接从控制器view_context.helper_name
答案 11 :(得分:0)
您可以使用 helper
关键字语法将辅助方法包含到控制器中
class MyController < ApplicationController
helper ApplicationHelper
end