ruby-on-rails - 如果我们事先不知道它们的存在,是否可以识别实例变量?

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

我在 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 方法获得什么数据(您的问题不清楚)。

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

例如,以下将构造变量名称及其值的散列,但仅填充具有返回真值的 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/

相关文章:

ruby-on-rails - 在 Heroku 部署后触发 Travis 运行

javascript - Rails 4 - javascript 文件未在生产中加载但在本地运行良好。 (英雄)

ruby - 格式化复杂哈希 - simple_form gem

ruby-on-rails - 仅当密码在参数中时验证 has_secure_password 的存在

mysql - 使用 Active Record .where 在 Rails 中查找列中具有 nil 值的表记录

ruby-on-rails - Rails 多客户端应用程序 - 我真的应该使用 API/json 吗?

ruby-on-rails - 哪个 Rails 版本最好?

ruby-on-rails - 如何指定Rails 3 scope.limit-带偏移量?

ruby-on-rails - 保存在主机上时,文件不会在 vagrant 中更新?

ruby - EventMachine: "` start_tcp_server': no acceptor (port is in use or requires root privileges)"