我有一个包含课程/问题/答案的嵌套表格。用户填充答案字段并单击提交。哈希如下所示:
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
答案 0 :(得分:0)
当你有嵌套的数据结构时,循环它们几乎是循环它们的唯一方法。是否合适是另一个问题。实际上,这似乎是很多工作(即使它是非常简单的工作)只是为了清理你的用户ID。老实说,只是修改传递这些参数的视图,将所有这些用户ID设置为当前登录用户,然后将它们发送到控制器而不是循环遍历它们似乎要容易得多(假设这是您试图解决的任何安全问题的适当解决方案)。
此外,您可能实际上有一些(例如)q.values的范围问题 - 这是一个等于哈希值的数组。修改s [:user_id]可能不会修改params [:lesson] [:question_attributes] [0] [:user_id](或者它可以解决的任何问题)。
就“防止大规模任务”而言,我不确定你为什么在这担心,你能详细说明吗?