Подтвердить что ты не робот

Rails 4 Сильные параметры - Обработка отсутствующих моделей Params Hash

Модель: Сообщения и пользователи

Сообщение принадлежит_у: user
Пользователь has_many: posts

Simple.

Предполагая, что существует несколько пользователей, мы посещаем страницу редактирования для сообщения.

<%= form_for @post do |f| %>

...

<% User.all.each do |user| %>
  <div><%= f.radio_button "user_id", user.id %></div>
<% end %>

...

Post Controller использует сильные параметры Rails 4.

params.require(:post).permit(:user_id)

Предположим, что в форме редактирования сообщения есть только переключатели.

Проблема: генерируется исключение ActionController:: ParameterMissing. param не найден: post

Причина, заключающаяся в том, что хэш-код Post param никогда не создается, вызывая выброс вышеуказанного исключения. Пустые переключатели, в отличие от пустых текстовых полей, например, не запускают хеш-память модели.

Что делать, если модель Post требует, чтобы user_id был действительным? Конечно, нужно было бы снова просмотреть представление, потому что сообщение не может быть сохранено.

Вопрос: Каков элегантный способ справиться с этой ситуацией, придерживаясь соглашения Rails?

UPDATE:

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

4b9b3361

Ответ 1

У меня есть аналогичная проблема, и мне не понравился ни один из этих ответов. В документации по рельсам (http://guides.rubyonrails.org/action_controller_overview.html#more-examples) я вижу следующее решение:

params.fetch(:blog, {}).permit(:title, :author)

Фактически вы задаете значение по умолчанию {}, которое, кажется, работает достаточно хорошо (по крайней мере, для моей ситуации).

Применяя к вашему коду, вы должны:

params.fetch(:post, {}).permit(:user_id)

Я думаю, что это достаточно чисто, и, похоже, работает в моем коде.

Ответ 2

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

  params.require(:post).permit(:user_id) if params[:post]