我有以下代码:

for attribute in site.device_attributes
  device.attribute
end

我希望代码用"attribute"的值替换方法名.

我try 了device."#{attribute}"种不同的排列方式.

这完全不可能吗?我错过什么了吗?

我已经考虑过重写方法_missing,但当我的问题是需要调用一个"未知"的方法时,我不知道这实际上会如何帮助我.

推荐答案

您可以使用#send method按方法名调用对象的方法:

object.send(:foo) # same as object.foo

可以将参数传递给调用的方法:

object.send(:foo, 1, "bar", 1.23) # same as object.foo(1, "bar", 1.23)

所以,如果变量"attribute"中有属性名,则可以使用

object.send(attribute.to_sym)

并用

object.send("#{attribute}=".to_sym, value)

在Ruby 1.8.6中,send方法可以执行任何对象的方法,而不管其可见性如何(例如,可以调用私有方法).这可能会在Ruby的future 版本中发生变化,您不应该依赖它.要执行私有方法,请使用#实例_eval:

object.instance_eval {
  # code as block, can reference variables in current scope
}

# or

object.instance_eval <<-CODE
  # code as string, can generate any code text
CODE

使现代化

您可以使用public_send来调用有关可见性规则的方法.

object.public_send :public_foo # ok
object.public_send :private_bar # exception

Ruby-on-rails相关问答推荐

确定当前太平洋时区是PST还是PDT

无法在 Rails 中使用 wkhtmltopdf 写入临时文件

Ruby on Rails 更新触发了 Mailer 函数中的 ArgumentError

如何让删除链接响应 Rails 7 中的 turbo_stream 和 html?

多行与内联块之间的不同行为

在 Datatable Ajax 调用中通过 Ajax 更新 div

Rails 5:如何从数据库中删除列?

如何在 Rails 3 中使用 Capybara 单击具有相同文本的第二个链接?

如何从 ActiveRecord 中的每个组中获取最新记录?

使用回形针调整图像大小

在两个 DateTime 之间迭代,步长为一小时

Rails如何对列求和?

.increment vs += 1

Ruby on Rails:调试 rake 任务

Rails,设计认证,CSRF 问题

错误:无法构建 gem 原生扩展 - 安装 mysql2 时出错

Ruby on Rails:如何从显示的子资源中获取错误消息?

Ruby 安装的 RVM 不工作?

扩展 Devise SessionsController 以使用 JSON 进行身份验证

如何删除删除选项表单 activeAdmin?