2017-01-17 1 views
0

を反復しながら、私は以下のコードを実行するときのparamsを通じてエラーのparams

を反復処理しようとすると、私はエラーを取得する:

def create_score 
    @quiz = Test.find_by(password: session[:test_password]) 
    @points = 0 
    @quiz.tasks.each_with_index do |task, index| 
    @task = Task.find_by(id: task) 
    @points += @task.score if @task.correct_answers.to_s == send("params[:test][:task#{index}]") 
    end 
    @score = Score.new(user_id: 2, name: "Test1", points: @points) 
    if @score.save 
    redirect_to root_url 
    else 
    redirect_to signup_path 
    end 
end 

私が手:

undefined method `params[:test][:task0]' ... 

@points += @task.score if @task.correct_answers.to_s == send("params[:test][:task#{index}]") 

これは、

{"utf8"=>"✓", 
"authenticity_token"=>"8h7rtv2yWio11DFo6kBKutdZl7RDBBaTrt7e8qel8fR5R5XsoXRhRrBeDQPPoZeuBlZ7N5PmqCxik06Z/gQLZQ==", 
"test"=>{"task0"=>["4"], "task1"=>["0"], "task2"=>["10"]}, 
"commit"=>"Zakończ test", 
"locale"=>"pl"} 

params[:test][:task0]ですが、まだそれがエラーを発生させ、何らかの理由で、私は本当に理由を知らないことを意味します

パラメータは次のようになりsend方法の問題。これがどうして起こるのか?

答えて

3

あなたはダイナミックキーとインデックスを作成する助け:

はこれを使用すると、以下のいずれかの方法を使用する必要があります意味します。別名:

params[:test]["task#{index}"] 

する必要があります。 paramsは文字列とシンボルに無関係にアクセスできることに注意してください。ここでは、あなたの思考のためのより多くの食料を与えることを


あなたは#sendと同じことを行っている可能性がある方法です。

params[:test].send(:[], "task#{index}") 

そして、ここでは、あなたがしようとしている名前を持っているでしょうメソッドを定義する方法であります呼び出すために:

define_method("params[:test][:task#{index}]") do 
    puts 'WTF' 
end 
+0

文字列の補間が記号 – Deep

+1

@Deepで直接動作しないことに言及すると、それは動作します: ':"タスク#{index} "'。 – ndn

0

あなたはシンボルであなたのparamsを呼んでいるが、代わりに、あなたは文字列を使用する必要があります。 、動的にメソッドを呼び出すことはありませ

params["test"]["task0"] または params[:test.to_s][:task0.to_s]

希望:)

+3

[rails docs](http://guides.rubyonrails.org/action_controller_overview.html#hash-and-array-parameters)から: "paramsオブジェクトはハッシュのように動作しますが、シンボルと文字列を同じ意味で使用できますキーとして。 –

0

をあなたはparams[:test][:task])代わりのsend("params[:test][:task#{index}]"のようなのparamsオブジェクトに何かを使用する必要があります。