更新嵌套的哈希参数。更新操作,ruby on rails

时间:2010-11-01 22:04:23

标签: ruby-on-rails hash for-loop nested-forms

我有一个包含课程/问题/答案的嵌套表格。用户填充答案字段并单击提交。哈希如下所示:

Parameters: {"commit"=>"Submit Answers", "action"=>"update", "_method"=>"put", "authenticity_token"=>"y##########o=", "lesson"=>{"questions_attributes"=>{"0"=>{"id"=>"1", "answer"=>{"response"=>"answertextanswertext", "user_id"=>"2"}}, "1"=>{"id"=>"4", "answer"=>{"response"=>"answertextanswertext", "user_id"=>"2"}}}}, "id"=>"1", "controller"=>"lessons"}

在我的更新声明中,出于安全目的,我想循环遍历答案并覆盖user_id。我将更新语句修改为以下内容:

  def update
    @lesson = Lesson.find(params[:id])
    lesson_params = params[:lesson]
    for q in lesson_params[:questions_attributes].values
      for s in q.values
        if !s[:user_id].nil?  
          s[:user_id] = current_user.id.to_s
        end
      end
    end
    if @lesson.update_attributes(lesson_params)
      flash[:notice] = "Answers submitted successfully."
      redirect_to lessons_path
    else
      render :action => 'edit'
    end
  end

我是一个菜鸟,所以遍历嵌套哈希是一个试验和错误。这是循环嵌套哈希的合适方法吗?这是防止大规模分配的好方法吗?

谢谢,Alex

1 个答案:

答案 0 :(得分:0)

当你有嵌套的数据结构时,循环它们几乎是循环它们的唯一方法。是否合适是另一个问题。实际上,这似乎是很多工作(即使它是非常简单的工作)只是为了清理你的用户ID。老实说,只是修改传递这些参数的视图,将所有这些用户ID设置为当前登录用户,然后将它们发送到控制器而不是循环遍历它们似乎要容易得多(假设这是您试图解决的任何安全问题的适当解决方案)。

此外,您可能实际上有一些(例如)q.values的范围问题 - 这是一个等于哈希值的数组。修改s [:user_id]可能不会修改params [:lesson] [:question_attributes] [0] [:user_id](或者它可以解决的任何问题)。

就“防止大规模任务”而言,我不确定你为什么在这担心,你能详细说明吗?