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 methodwith_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"}}
¿Fue útil?

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]) end

     

Si sólo hizo esto:

     

form_for @song do | f |

     

Puede conseguir este hash params:

     

params = { "comprometerse" => "Añadir",               "Authenticity_token" => "...",               "Canto" => { "song_attributes" => {...}}               }

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top