Ruby on rails Rails使用属性作为方法中的字符串

Ruby on rails Rails使用属性作为方法中的字符串,ruby-on-rails,Ruby On Rails,我正在使用宝石炼金术士进行单位转换。 在我的模型中,考虑到这一点: class Item < ApplicationRecord def converted quantity = 1 quantity.kg.to.g end end unit\u purchase和unit\u inventory是类的属性(字符串),对应于kg、g等值 因此,也许类似于: x = self.unit_purchase y = self.unit_inven

我正在使用宝石炼金术士进行单位转换。 在我的模型中,考虑到这一点:

class Item < ApplicationRecord
    def converted
        quantity = 1
        quantity.kg.to.g
    end
end
unit\u purchase
unit\u inventory
是类的属性(字符串),对应于kg、g等值

因此,也许类似于:

x = self.unit_purchase
y = self.unit_inventory
quantity.x.to.y

但是我很难找到语法。

如果您真的想用这种困难的方式来实现这一点:

unit_purchase = :kg
unit_inventory = :g
quantity.send(unit_purchase).to.send(unit_inventory)
这取决于绝对肯定地知道这两个参数是有效的,并且不是用户提供的恶意参数

更安全的方法是定义更任意的转换方法,如:

quantity.convert(from_unit: unit_purchase, to_unit: unit_inventory)

在这里,可以相应地检查参数,并在意外值上提高。

单位购买来自数据库。它是当前类的一个属性。为什么我要把它设为kg?这使得它是静态的。第二个解决方案没有遵循GEI所要求的语法,在发布问题之前,用我一直尝试的方法更新了问题。这两个参数始终有效,因为用户只需输入项目,并且默认情况下,每个项目都正确设置了单位采购和单位库存。@Catmal我会更加偏执。
unit\u-purchase
unit\u-inventory
是否曾经接近用户输入?你确定永远都是这样吗?您是否有明确的白名单,以确保单元永远不会与“真实”方法名冲突?如果你愿意,你可以在一桶鱼钩中寻找苹果,但如果有更安全的选择,为什么还要冒险呢?@Catmal仅仅因为U/I限制了这些值并不意味着你不能通过诸如
curl
postman
等机制从U/I外部发出请求,等。保存前,应至少在模型中验证这些值,并且在使用
send
机制时,应在转换前验证这些值。
quantity.convert(from_unit: unit_purchase, to_unit: unit_inventory)