Rails 4 сильных параметра: проверьте, находится ли параметр в белом списке, фактически не обновляя его.

Я создал некоторые встроенные функции редактирования с использованием AJAX, которые позволяют пользователю обновлять множество небольших фрагментов информации на странице, а затем создают JS для обновления страницы. Эта же логика должна обрабатывать десятки различных мини-форм, содержащих разные атрибуты или наборы атрибутов (таких как имя и фамилия). В большинстве случаев изменяемое значение совпадает со значением для обновления на странице, поэтому легко написать вызов Jquery для соответствующего обновления содержимого. Однако иногда я хочу переопределить то, что будет обновлено: например, когда пользователь меняет свой почтовый индекс, впоследствии также должны отображаться его город и штат.

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

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

Есть ли способ проверить, находится ли атрибут «в белом списке», т.е. будет принят в user_params, даже если мы не пытаемся его изменить?

Или, в качестве альтернативы, есть ли другой способ удовлетворить эту потребность?


person Topher Hunt    schedule 27.05.2014    source источник


Ответы (1)


Я бы определил список параметров, которые вы разрешаете в константе, а затем проверил это. Вот аналогичный пост SO, который делает это.

Вкратце:

# In your model object (e.g. MyModel)
PERMITTED_FIELDS = %w(field1 field2 field3)

# In your controller
def my_object_params
  params.require(:user).permit(MyModel::PERMITTED_FIELDS)
end

Затем вы можете получить доступ к MyModel::PERMITTED_FIELDS по мере необходимости в другом месте.

person pdobb    schedule 27.05.2014
comment
Ах, это будет идеально. Я не знал, что #permit примет массив. Спасибо! - person Topher Hunt; 28.05.2014
comment
Рад слышать это. Примечание: даже если #permit не принимает массив, вы все равно можете начать с него, а затем добавить к нему * (по сути, просто удаляя квадратные скобки): .permit(*MyModel::PERMITTED_FIELDS). - person pdobb; 28.05.2014
comment
Спасибо еще раз. Я видел пятно вокруг, но не играл с ним много. Это очень помогает! - person Topher Hunt; 28.05.2014