Обновление параметров вложенного хеша.Обновление экшена, ruby ​​on rails - PullRequest
3 голосов
/ 02 ноября 2010

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

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

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

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

1 Ответ

0 голосов
/ 02 ноября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...