如果我们事先不知道它们的存在,可以识别实例变量吗?

时间:2014-05-21 09:46:41

标签: ruby-on-rails ruby ruby-on-rails-4

我在控制器中设置了一个具有特定属性的实例变量,例如

@post.errors

是否有任何方法可以在不知道关于@post(或任何其他实例变量)的情况下检查视图

a)是否有可用的实例变量?
b)如果上述情况属实,是否设置了属性errors

更新

如果上述问题返回true,则返回实例变量。

3 个答案:

答案 0 :(得分:1)

这是检查当前作用域中的任何实例变量是否具有true的{​​{1}}值的一种方法

errors

您可能需要修改第三行,具体取决于您通常使用error_somewhere = instance_variables.any? do |var_symbol| var_value = instance_variable_get( var_symbol ) var_value.respond_to?( :errors ) ? var_value.errors : false end 方法预期的数据(不清楚您的问题)。

您可能还想进一步修改此标识以识别错误变量(您可以使用errorsmap或者可能写入哈希值)

例如,以下内容将构造变量名称及其值的哈希值,但仅填充具有返回true值的compact方法的实例变量:

errors

如果在控制器内部运行,或者在these_have_errors = Hash[ instance_variables.map do |var_symbol| var_value = instance_variable_get( var_symbol ) if var_value.respond_to?( :errors ) && var_value.errors [ var_symbol, var_value ] else nil end end.compact ] 方法之前添加controller.,则应获得如下结果:

instance_variables*

当@post存在且具有来自{ :@post => (value of @post) } 的真实返回值。

这里的重要方法可以让你自省完成任务:

答案 1 :(得分:1)

在您看来,您可以

controller.instance_variables

这将返回一个控制器类的所有实例变量的数组。

请注意,这将包含Rails初始化的变量,如

:@_routes, :@_action_has_layout, :@_headers,以及您在action

中初始化的内容

答案 2 :(得分:0)

您可以使用try object

@post.try(:errors)