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:
Мозговой штурм об этом дальше, я уверен, что, вероятно, есть много других ситуаций, которые порождают эту проблему; это не обязательно соответствует переключателям.
Ответы
Ответ 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]