迭代参数时出错

时间:2017-01-17 15:31:44

标签: ruby-on-rails ruby metaprogramming

当我尝试迭代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 个答案:

答案 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}]"