我在 Controller 中设置了一个具有特定属性的实例变量,例如
@post.errors
是否有任何方法可以在不知道 @post
(或任何其他实例变量)的情况下检查 View :
a) 是否有可用的实例变量?
b) 如果以上为真,是否设置了属性 errors
?
更新
如果以上问题都返回真,则返回实例变量。
最佳答案
这将是一种检查当前作用域中的任何实例变量是否具有 true
值的方法 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
您可能需要修改第三行,具体取决于您一般希望从 errors
方法获得什么数据(您的问题不清楚)。
您可能还想进一步修改它以识别错误变量(您可以使用 map
和 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*
方法之前添加 controller.
,您应该得到如下结果:
{ :@post => (value of @post) }
当@post 存在并且从@post.errors
有一个真实的返回值时。
这里的重要方法可以让您反省以完成任务:
关于ruby-on-rails - 如果我们事先不知道它们的存在,是否可以识别实例变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23779579/