0

我在 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当我调用a时,我得到一个输出字符串HostingController.new,但仍然@body_id是未定义的。

self我也从 a中删除self.variable_instance_set,甚至用 a 替换这一行@body_id = "Test",但这仍然不起作用。我究竟做错了什么?

编辑:

我知道我在哪里犯了错误。我尝试在创建类实例之前设置实例变量。似乎self.set_body_id应该参与一个类initialize,但仍然不知道如何去做。

4

3 回答 3

0

我认为你必须这样写:

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

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

于 2012-09-05T09:15:56.433 回答
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 提示,我能够弄清楚:)

于 2012-09-05T09:38:47.740 回答
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实例变量应该可以在所有方法中访问。通过检查来尝试

于 2012-09-05T10:50:12.477 回答