Rails 4 Strong Parameters-Обработка Отсутствующих Параметров Модели

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

Post belongs_to: user
Пользователь типа has_many :должности

простой.

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

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

...

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

...

регулятор столба использует рельсы 4 сильных параметра.

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

предположим редактирование поста только радиокнопки в виде полей.

: ActionController:: ParameterMissing создается исключение. param не найден: post

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

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

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

обновление:

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

2 ответов


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

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

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

применяясь к вашему коду, вы бы имели:

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

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


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

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