我从rails 2.x迁移到3.x.现在调用控制器方法时抛出
undefined method `my_helper_method' for nil:NilClass
MyController.rb
class MyController < ApplicationController
def foo
@template.my_helper_method
end
end
MyControllerHelper.rb
class MyControllerHelper
def my_helper_method
puts "Hello"
end
end
的ApplicationController
class ApplicationController < ActionController::Base
helper :all
end
如何使这个工作?
答案 0 :(得分:2)
这实际上是在另一篇SO帖子中回答:Rails 3: @template variable inside controllers is nil
基本上,您可以将@template
替换为view_context
答案 1 :(得分:1)
@template
是一个对象,在您的情况下nil
。如果此对象中没有方法(my_helper_method
),则无法调用它(特别是如果它为零)。
在助手中定义的方法与常规方法一样被调用。但不是在控制器中,它们在视图中被调用。您的helper :all
只会使所有帮助程序都可用于视图。
因此,在您看来:my_helper_method :arg1, :arg2
如果您需要对象的方法(@template
),则需要为对象提供此方法。
示例:强>
class Template < ActiveRecord::Base
def my_helper_method
# do something on a template instance
end
end
class MyController < ApplicationController
def foo
@template = Template.first
@template.my_helper_method # which actually isn't a helper
end
end
帮助者做什么:
module MyHelper
def helper_method_for_template(what)
end
end
# in your view
helper_method_for_template(@template)
在帮助器中混音(在将视图助手与视图和模型混合时,请注意代码中的混乱)
class Template < ActiveRecord::Base
include MyHelper
# Now, there is @template.helper_method_for_template(what) in here.
# This can get messy when you are making your helpers available to your
# views AND use them here. So why not just write the code in here where it belongs
# and leave helpers to the views?
end