2016-11-11 6 views
1

私はこのようになります方法があります。その後、私はこのようになります呼び出してい変数に格納された値をメソッド呼び出しとして使用するにはどうすればよいですか?

> rating 
=> "speed" 

を:私は何をしたいか

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

はそのコールにratingの値を渡しています。

しかし、私はこれを行うとき:各ratingsオブジェクトにratingと呼ばれる方法がないので

profile.ratings.find_by(user: current_user).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

を使用することができます。

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

これはsend方法以来よりも安全です属性を取得するだけです。 ban_and_charge_ten_bucks!というメソッドがある場合は、あなたが呼び出しているものを確認せずにsendに電話すると、敵対的なユーザーがあなたのシステムを呼び出すことができるかもしれません。

+0

良い点。私はこのアプローチを好む。ヒントをありがとう! – marcamillion

2

あなたはActiveRecordのモデルのプロパティにアクセスするために探しているなら、彼らは、単純なアクセサを提供send method

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

これがユーザーデータの場合は、**任意に実行しないことにも注意してください。安全の理由から、許可されたメソッドのホワイトリストを持つことが最善です。 – tadman

+0

@tadmanそれはまさに私がやっていることです....私は繰り返し受け入れる入力の配列を持っています。私はちょうどそれに応じてそれぞれを実行できるようにする必要があります。 – marcamillion

+0

メソッド名があなたのコントロール下にある場合はここで問題ありません。ちょっと注意してください。これがCVNの作り方です。 – tadman

関連する問題