【问题标题】:Scan instance variable from controller从控制器扫描实例变量
【发布时间】:2014-06-11 09:31:38
【问题描述】:

有没有办法从控制器的方法中读取(扫描)所有实例变量?

例如:

我将在控制器中定义一些实例变量,无论是索引还是显示或自定义方法。我想从一个地方知道(获取)所有实例变量值。

class TestClass
  def t1
    @v1 = "test"
  end

  def t2
    @v2 = "test1"
  end
end

TestClass.instance_variables
 => [] 

tc = TestClass.new
tc.t1
tc.instance_variable_names
=> ["@v1"]

上面的代码适用于具有自定义方法而不是默认方法(索引、显示等)的类。

Rails.env
=> "development"
u = UsersController.new
 => #<UsersController:0x00000004233990 @_routes=nil, @_action_has_layout=true, @_headers={"Content-Type"=>"text/html"}, @_status=200, @_request=nil, @_response=nil> 
1.9.3p448 :109 > u.index
NoMethodError: undefined method `env' for nil:NilClass

【问题讨论】:

    标签: ruby-on-rails instance-variables


    【解决方案1】:

    调用 instance_variables() 方法。

    instance_variable_names()
    
    # File activesupport/lib/active_support/core_ext/object/instance_variables.rb, line 27
    def instance_variable_names
       instance_variables.map { |var| var.to_s }
    end
    

    【讨论】:

    • 有效吗?我确信它不会起作用。请举例说明你的答案。
    • @Mr.Black 我从 api 文档中得到它。不亲自验证。希望对您有所帮助。
    • 谢谢。它仅适用于具有自定义方法而不是资源方法的类。我得到了这个问题的重复。 stackoverflow.com/questions/6061489/…
    【解决方案2】:

    最简单的方法可能是这样的:

    a = TestClass.new
    after_init = a.instance_variables
    a.t1
    after_t1 = after_init -  a.instance_variables
    

    【讨论】:

    • 谢谢。它不适用于实际控制器。
    • 我有一个控制器列表,这些控制器在大多数具有不同值的方法中都有一些独特的变量。我需要获取特定实例变量的值并传递给通用函数。
    • 我假设你在控制器中使用了'before_action',在执行调用'index','show'之前手动调用这些方法...
    • 是的,我也想。但是,似乎我不能直接调用方法索引或显示。请参阅我更新的问题。
    • 从示例中可以清楚地看出,您有一些没有方法“env”的变量。显示整个方法代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多