Обновление параметров вложенного хэша. Действие обновления, рубин на рельсах

У меня есть вложенная форма, которая включает урок / вопросы / ответы. Пользователь заполняет поля ответа и нажимает "Отправить". Хеш показан ниже:

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

Я новичок, поэтому просмотр вложенного хеша был немного методом проб и ошибок. Это подходящий способ перебора вложенного хэша? Это хороший способ защититься от массового присвоения?

Спасибо алекс


person Alex    schedule 01.11.2010    source источник


Ответы (1)


Когда у вас есть вложенные структуры данных, цикл по ним - практически единственный способ их перебрать. Уместно это или нет - другой вопрос. На самом деле, это кажется большой работой (хотя это довольно простая работа) только для того, чтобы очистить ваши идентификаторы пользователей. Честно говоря, кажется намного проще просто изменить представление, которое передает эти параметры, чтобы установить все эти идентификаторы пользователей для текущего пользователя, вошедшего в систему до их отправки на ваш контроллер, чем перебирать их в цикле. (при условии, что это подходящее решение любой проблемы безопасности, которую вы пытаетесь решить).

Кроме того, у вас могут быть некоторые проблемы с областью видимости (например) с q.values ​​- это массив, эквивалентный значениям в хэше. Изменение s [: user_id] не может изменять params [: lesson] [: question_attributes] [0] [: user_id] (или что бы там ни было).

Что касается «защиты от массового присвоения», я не уверен, почему вы беспокоитесь об этом здесь, вы можете уточнить?

person Brett Bender    schedule 01.11.2010