Capturar current_user.id guardando registros profundamente anidados

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

preguntado el 02 de mayo de 12 a las 19:05

1 Respuestas

¿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 or haz tu propia pregunta.