当我尝试迭代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]
,但仍然出于某种原因会引发错误,但我不知道为什么。任何想法为什么会这样?
答案 0 :(得分:3)
您希望使用动态键进行索引,而不是动态调用方法。又名:
params[:test]["task#{index}"]
应该这样做。请注意,params对字符串和符号具有无差别的访问权限。
为了给您提供更多值得思考的问题,您可以通过#send
来完成同样的工作:
params[:test].send(:[], "task#{index}")
以下是如何定义一个具有您要调用的名称的方法:
define_method("params[:test][:task#{index}]") do
puts 'WTF'
end
答案 1 :(得分:0)
您使用符号呼叫params
,而应使用字符串。
这意味着您应该使用以下方法之一:
params["test"]["task0"]
要么
params[:test.to_s][:task0.to_s]
希望有所帮助:)
答案 2 :(得分:0)
您应该使用params对象,例如params[:test][:task])
而不是send("params[:test][:task#{index}]"
。