problemas con los parametros de generación para accepts_nested_attributes_for
-
01-10-2019 - |
Pregunta
Estoy intentando añadir el user_id a un atributo anidado que consigue construida por un controlador padres pero no parecen tener el efecto deseado?
Ie. Tengo un modelo llamado Place.rb cuales accepts_nested_attributes_for :reviews
y has_many :reviews, :as => :reviewable, :dependent => :destroy
El atributo anidado funciona bien y que la edifican dentro del controlador lugares como tan ...
nueva acción
@review = @place.reviews.build(:user_id => current_user.id)
crear la acción
params[:place].merge(:user_id => current_user.id)
params[:place][:reviews_attributes].merge!(:user_id => current_user.id)* bad
@place = Place.new(params[:place])
Este es el original, para el modelo lugar para conseguir una user_id, ahora necesito el user_id para la revisión del modelo anidado también. Podría parecer extraño que los lugares y las revisiones ambos tienen user_ids, pero la gente puede agregar nuevos comentarios en el mismo lugar ...
posiblemente como este, pero no funciona:
@place = Place.new(params[:place].merge(:user_id => current_user.id, :reviews_attributes => { :user_id => current_user.id } ))
obtener el error: undefined method
with_indifferent_access' de 3: Fixnum`
o
@place = Place.new(params[:place].merge(:user_id => current_user.id, :reviews_attributes => { "0" => { :user_id => current_user.id }}))
que se suma el user_id correcta pero reemplaza el contenido de la revisión con NULL; - (
Me estaba añadiendo previamente al usuario a través de la forma, pero le gustaría hacerlo a través del controlador de modo que sólo se suma el user_id en la creación, como una revisión en particular puede recibir información actualizada por otra persona y yo no quiero la actualización cambiando el user_id del escritor original ...
camino antiguo que funciona:
<%= e.label :content, "Review" %><br />
<%= e.text_area :content, :rows => 20, :class => 'jquery_ckeditor' %><br />
<%= e.hidden_field :user_id, :value => current_user.id %> #want to remove this line
pero a través del controlador del método de aumento con opciones no tiene ningún efecto? ¿Algunas ideas? ¿No puedo hacer esto a través de la acumulación?
La salida en el registro:
Parameters: {"commit"=>"Submit", "action"=>"create", "city_id"=>"prague",
"controller"=>"places", "place"=>{"address"=>"fsdfsdf", "name"=>"sdfsdfsd",
"reviews_attributes"=>{"0"=>{"content"=>"<p>\r\n\tsdfsdfsdfsdfsdfsdfsdf sdfsdfsdf</p>\r
\n"}}, "website"=>"", "city_id"=>"1036", "place_type"=>"1"}}
Solución
Prueba esto:
params[:place][:user_id] = current_user.id
params[:place][:reviews_attributes].each do |key, review|
review[:user_id] = current_user.id
end if params[:place][:reviews_attributes]
Otros consejos
Asumiendo que tiene params[:review]
como hash de los atributos, que tiene que hacer un merge!
:
params[:review].merge!(:user_id => current_user.id)
@review = @place.reviews.build(params[:review])
Editar
También estoy asumiendo que va a utilizar este método está en create
.
Editar # 2:
No va a funcionar en el método new
ya que, como se puede encontrar en la railsapi.com , el método de aumento
"sólo funciona si un objeto asociado ya existe, no se si es nula! "
Editar # 3: No estoy seguro de si se trata de la mejor manera, pero he probado aquí y funcionó ...
Usted tiene estos parámetros:
{"commit"=>"Submit", "action"=>"create", "city_id"=>"prague",
"controller"=>"places", "place"=>{"address"=>"fsdfsdf", "name"=>"sdfsdfsd",
"reviews_attributes"=>{"0"=>{"content"=>"<p>\r\n\tsdfsdfsdfsdfsdfsdfsdf
sdfsdfsdf</p>\r\n"}}, "website"=>"", "city_id"=>"1036", "place_type"=>"1"}}
Así se puede acceder comentarios atributos de esta manera: params[:place][:reviews_attributes]
y, para fusionar el atributo user_id
, que puede hacer:
params[:place][:reviews_attributes].each_value {
|v| v.merge!(:user_id => current_user.id)
}
Ahora se ve params[:place][:reviews_attributes]
como este ejemplo:
{"0"=>{
"user_id"=>"1",
"content"=>"<p>\r\n\tsdfsdfsdfsdfsdfsdfsdf sdfsdfsdf</p>\r\n"
}}
Se puede o no quiere añadir un campo oculto en el formulario que incluye el user_id. A continuación, el params de hash ya tendrá el valor. Si usted está preocupado acerca de la manipulación, se podía comparar con el current_user.id. Por otra parte, tal vez por eso que está tratando de esta manera, para empezar?
Puede que esté utilizando form_for con una sintaxis pobre. He dejado de usar hidden_fields después de mirar esto: http://apidock.com/rails/ActionView / Ayudantes / FormHelper / form_for
y este comentario: (! Dios los bendiga, nachocab)
nachocab - 2 de noviembre de 2008 params picadillo obtiene el modelo Identificación automática
El hash params obtiene automáticamente poblado con el id de cada modelo que se pasa a form_for. Si nosotros fueron la creación de una canción dentro de una álbum existente:
URL: / álbumes / 209 / canciones / nueva form_for [@Album, @song] do | f | ... f.submit "Añadir" fin
El hash params sería:
params = { "comprometerse" => "Añadir", "Authenticity_token" => "...", "Album_id" => "209", "Canto" => { "song_attributes" => {...}} }
Por lo tanto, en el songs_controller usted podría utilizar este album_id en un before_filter:
before_filter: find_album
protegida find_album def @album = Album.find (params [: album_id]) endSi sólo hizo esto:
form_for @song do | f |
Puede conseguir este hash params:
params = { "comprometerse" => "Añadir", "Authenticity_token" => "...", "Canto" => { "song_attributes" => {...}} }