2016-11-11 30 views
1

我有一个看起来像这样的方法:如何将变量中存储的值用作方法调用?

> rating 
=> "speed" 

然后,我有一个电话,看起来像这样:

profile.ratings.find_by(user: current_user).speed 

我想要做的是rating值传递给该呼叫。

但是,当我这样做:

profile.ratings.find_by(user: current_user).rating 

它不工作,因为没有每个ratings对象上调用rating方法。

这是我的错误,当我运行上面:

Rating Load (4.5ms) SELECT "ratings".* FROM "ratings" WHERE "ratings"."profile_id" = $1 AND "ratings"."user_id" = 7 LIMIT $2 [["profile_id", 12], ["LIMIT", 1]] 
NoMethodError: undefined method `rating' for #<Rating:0x007fca0c4fba90> 

我通常会做串插,除了现在我上的方法调用工作。

我该怎么做?

回答

4

如果你正在寻找他们提供了一个简单的访问ActiveRecord模型访问属性:

profile.ratings.find_by(user: current_user)[rating] 

这比自send方法更安全它只会获取属性。如果您有一种叫做ban_and_charge_ten_bucks!的方法,某些恶意用户可能会让您的系统调用,如果您拨打send而不检查您打电话的内容。

+0

好点。我更喜欢这种方法。谢谢你的提示! – marcamillion

2

可以使用send method

profile.ratings.find_by(user: current_user).send(rating) 
+1

值得注意的是,如果这是用户数据,**不要**随意执行它。为了安全起见,最好有一个允许的方法的白名单。 – tadman

+0

@tadman这就是我正在做的....我有一个接受的输入数组,我正在迭代。我只需要能够相应地执行。 – marcamillion

+0

如果方法名称在你的控制之下,那么你在这里很好。小心一点。这就是CVN的制作方式。 – tadman

相关问题