Capturar current_user.id guardando registros profundamente anidados
Frecuentes
Visto 134 veces
0
Digamos que tengo un formulario de trabajo que se parece a lo siguiente
=form_for @survey do |f|
=f.text_field :name
=f.fields_for :questions do |question_fields|
=question_fields.text_field :question_text
=question_fields.fields_for :answers do |answer_fields|
=answer_fields.text_field :answer_text
Debido a que diferentes usuarios pueden agregar y actualizar diferentes partes del formulario, necesito una forma de obtener el ID de usuario en cada modelo antes de guardarlo. Me doy cuenta de que no es compatible con mvc para poder acceder a current_user dentro del modelo, dicho esto, me quedo sin solución.
Si solo estuviera guardando un objeto, sería bastante simple asignar current_user.id al objeto en el controlador, pero dada la naturaleza profundamente anidada de este formulario, comienza a parecer una solución fea.
¿Hay una forma experta/rápida de manejar esto?
Rieles 3.2, dispositivo
1 Respuestas
1
¿No puede cada uno de los objetos simplemente robar el user_id
de su relación de "padres"? Este es un patrón común:
class Answer < ActiveRecord::Base
before_validation :assign_user_id
protected
def assign_user_id
# Don't attempt if the question is not defined,
# or the user_id field is already populated.
return unless (self.question or self.user)
self.user_id = self.question.user_id
end
end
Esto implica un poco de actividad adicional en la base de datos para resolver la respuesta de cada pregunta, ya que crearla en un ámbito no es suficiente, pero lo hace bastante infalible.
Lo que probablemente quieras hacer es cosas en el user_id
parámetro al crear cada registro. Esto significa que su create
la llamada debe fusionarse en un :user_id
clave donde sea necesario. Sin embargo, el asistente anidado no hace esto de forma predeterminada, por lo que si lo está utilizando, puede dejarlo en manos del método de asignación.
contestado el 02 de mayo de 12 a las 20:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas ruby-on-rails or haz tu propia pregunta.