2017-01-17 3 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}]") 

Это означает, что он имеет Проблема с send методом

Параметры выглядеть следующим образом:

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

Это означает, что есть params[:test][:task0], но все же по какой-то причине он выстреливает ошибку, но я не знаю, почему. Любые идеи, почему это происходит?

ответ

3

Вы хотите индексировать с динамическим ключом, а не вызывать метод динамически , Aka:

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

Следует делать. Обратите внимание, что параметры имеют безразличный доступ к строкам и символам.


Чтобы дать вам больше пищи для размышлений, вот как вы могли бы сделать то же самое с #send:

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

А вот как определить метод, который будет иметь имя, которое вы пытаетесь позвонить:

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

Стоит отметить, что интерполяция строк не будет работать с символом непосредственно – Deep

+1

@Deep, он работает - ':" task # {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 что-то вроде params[:test][:task]) вместо send("params[:test][:task#{index}]".