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]