strong rails permit ruby-on-rails-4 strong-parameters

ruby on rails 4 - permit - Rails 4 Strong Parameters-Manejo del hash de parámetros del modelo faltante



rails params permit nested attributes (2)

Modelos: Publicaciones y Usuarios.

Publicar pertenecer a: usuario
Usuario has_many: mensajes

Sencillo.

Suponiendo que existan algunos usuarios, visitamos la página de edición de una publicación.

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

...

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

...

El controlador del poste aprovecha los fuertes parámetros de Rails 4.

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

Supongamos que la forma de edición de publicación solo tiene los botones de opción como campos.

Problema: se lanza la excepción ActionController :: ParameterMissing. param no encontrado: post

La razón de ser el hash de params de publicación nunca se crea, lo que provoca que se lance la excepción anterior. Los botones de opción vacíos, a diferencia de los campos de texto vacíos, por ejemplo, no activan el hash param del modelo que se va a crear.

¿Qué pasa si el modelo de publicación requiere que un user_id sea válido? Ciertamente, uno querría renderizar la vista nuevamente por la razón por la cual no se puede guardar la publicación.

Pregunta: ¿Cuál es una manera elegante de manejar esta situación mientras se adhiere a la convención de Rails?

ACTUALIZAR:

Después de una lluvia de ideas acerca de esto, estoy seguro de que probablemente hay muchas otras situaciones que generan este problema; No corresponde necesariamente a los botones de radio.


Esta fue mi solución inmediata ... aunque parece un poco tonta porque, ¿por qué tiene que verificar los parámetros de los mensajes si está claramente en el controlador de correos y los necesita de todos modos? Parece muy contradictorio. ¿Es esta realmente la mejor manera?

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


Tengo un problema similar, y no me gustó mucho ninguna de estas respuestas. En la documentación de Rails ( http://guides.rubyonrails.org/action_controller_overview.html#more-examples ) veo la siguiente solución:

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

Efectivamente, está suministrando un valor predeterminado de {}, que parece funcionar lo suficientemente bien (al menos para mi situación).

Aplicando a tu código, tendrías que:

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

Creo que esto es razonablemente limpio y parece funcionar en mi código.