控制器中的助手 - Rails 3

时间:2012-01-18 10:21:31

标签: ruby-on-rails-3 helpers controllers

我从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

如何使这个工作?

2 个答案:

答案 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