在ApplicationController中为控制器设置实例变量不起作用

时间:2012-09-05 09:13:57

标签: ruby-on-rails

我在ApplicationController文件中创建了一个方法,该方法应该在我的所有操作中设置实例变量:

def self.set_body_id(id)
    print "This is test"
    self.instance_variable_set(:@body_id, id)
end

当我在另一个控制器中调用此方法时,如下所示:

class HostingController < ApplicationController
    set_body_id "Test"

    def index
    end
end

..没有任何反应。 @body_id变量在视图中不可用。所以我运行一个rails控制台来检查这个函数是否被执行,正如我预期的那样,当我调用This is test时,我输出HostingController.new字符串,但仍然是@body_id未定义。

此外,我从self删除self.variable_instance_set,甚至用@body_id = "Test"补充此行,但这仍然无效。我做错了什么?

编辑:

我知道我犯了什么错误。我甚至在创建类实例之前尝试设置实例变量。 self.set_body_id似乎涉及到一个班级initialize,但仍然不知道该怎么做。

3 个答案:

答案 0 :(得分:0)

我认为你必须这样写:

def set_body_id(id)
  instance_variable_set("@body_id", id)
end

更新:我刚看到你使用了一个应该是实例方法的类方法。我更新了代码。

答案 1 :(得分:0)

class ApplicationController < ActionController::Base
    protect_from_forgery

    def self.set_body_id(id)
        self.class_variable_set(:@@body_id, id)
    end

    before_filter :set_body_attributes

    private

    def set_body_attributes
        @body_id = self.class.class_variable_get(:@@body_id)
    end
end

感谢您的回复,感谢@apneadiving提示,我能够弄明白:)

答案 2 :(得分:0)

这应该可以帮到你

 class ApplicationController < ActionController::Base

    protected
      def set_body(id)
        ApplicationController.get_id(id)
      end

     def self.get_id(id)
      self.class_variable_set(:@@body, id)
      end
   end

您的主机控制器

class HostingController < ApplicationController
   before_filter :set_body

protected

  def set_body
      @body = super(params[:id])
  end
end

我在set_body中设置的 @body 实例变量应该可以在所有方法中访问。通过检查来试试