Rails 3, anidada multi-nivel de las formas y has_many a través de

Estoy tratando de hacerlo funcionar pero doesnt!

He

class User < ActiveRecord::Base
  has_many :events, :through => :event_users
  has_many :event_users
  accepts_nested_attributes_for :event_users
end

class Event < ActiveRecord::Base
  has_many :event_users
  has_many :users, :through => :event_users
  accepts_nested_attributes_for :users
end

class EventUser < ActiveRecord::Base
  set_table_name :events_users
  belongs_to :event
  belongs_to :user
  accepts_nested_attributes_for :events
  accepts_nested_attributes_for :users
end

Y también la tabla de diseño de

event_users
  user_id
  event_id
  user_type
events
  id
  name
users
  id
  name

Y esta es mi forma

<%= semantic_form_for @event do |f| %>
  <%= f.semantic_fields_for :users, f.object.users do |f1| %>
    <%= f1.text_field :name, "Name" %>
    <%= f1.semantic_fields_for :event_users do |f2| %>
      <%= f2.hidden_field :user_type, :value => 'participating' %>
    <% end %>
  <% end %>
<%= link_to_add_association 'add task', f, :users %>
<% end %>

El problema es que si creo un nuevo usuario de esta manera, no establece el valor de user_type (pero crea un usuario y una event_users con user_id y event_id). Si vuelvo a editar de forma después de la creación de un usuario, se someten, a continuación, el valor de user_type se establece en events_users. (También he probado sin formtastic)
Alguna sugerencia? Gracias!

—-edit—-

También he probado a tener el event_users antes de que los usuarios

<%= semantic_form_for @event do |f| %>
  <%= f.semantic_fields_for :event_users do |f1| %>
    <%= f1.hidden_field :user_type, :value => 'participating' %>
    <%= f1.semantic_fields_for :users do |f2| %>
      <%= f2.text_field :name, "Name" %>
    <% end %>
  <% end %>
<%= link_to_add_association 'add task', f, :event_users %>
<% end %>

pero luego me lanza un error:

De usuario(#2366531740) espera, tengo
ActiveSupport::HashWithIndifferentAccess(#2164210940)

–edit–

la link_to_association es una de formtastic-cocoon (método de https://github.com/nathanvda/formtastic-cocoon), pero he intentado hacer otros enfoques, pero con el mismo resultado

—edit—-

def create
  @event = Event.new(params[:event])
  respond_to do |format|
    if @event.save
      format.html { redirect_to(@event, :notice => 'Event was successfully created.') }
      format.xml  { render :xml => @event, :status => :created, :location => @event }
    else
      format.html { render :action => "new" }
      format.xml  { render :xml => @event.errors, :status => :unprocessable_entity }                 
    end
  end
end
  • Puede que nos muestran el controlador de acción de crear?
InformationsquelleAutor jonepatr | 2011-01-12

2 Kommentare

  1. 2

    Para ser honesto, nunca he probado a editar o crear un has_many :through de esa manera.

    Tomó un poco de tiempo, y tuve que arreglar el js dentro de formtastic_cocoon para que funcione, así que aquí es una solución de trabajo.

    Necesita specift la EventUser modelo y, a continuación, llenar el User modelo (de otra manera no va a funcionar).

    Así que dentro de los modelos de escribir:

    class Event < ActiveRecord::Base
      has_many :event_users
      has_many :users, :through => :event_users
      accepts_nested_attributes_for :users, :reject_if => proc {|attributes| attributes[:name].blank? }, :allow_destroy => true
      accepts_nested_attributes_for :event_users, :reject_if => proc {|attributes| attributes[:user_attributes][:name].blank? }, :allow_destroy => true
    end
    
    class EventUser < ActiveRecord::Base
      belongs_to :user
      belongs_to :event
      accepts_nested_attributes_for :user
    end
    
    class User < ActiveRecord::Base
      has_many :events, :through => :event_users
      has_many :event_users
    end

    A continuación, los puntos de vista. Comience con el events/_form.html.haml

    = semantic_form_for @event do |f|
      - f.inputs do
        = f.input :name
    
        %h3 Users (with user-type)
        #users_with_usertype
          = f.semantic_fields_for :event_users do |event_user|
            = render 'event_user_fields', :f => event_user
          .links
            = link_to_add_association 'add user with usertype', f, :event_users
    
        .actions
          = f.submit 'Save'

    (ignoro errores por ahora)
    A continuación, tendrá que especificar el parcial _event_user_fields.html.haml parcial (aquí viene un poco de la magia) :

    .nested-fields
      = f.inputs do
        = f.input :user_type, :as => :hidden, :value => 'participating'
        - if f.object.new_record?
          - f.object.build_user
        = f.fields_for(:user, f.object.user, :child_index => "new_user") do |builder|
          = render("user_fields", :f => builder, :dynamic => true)

    y para finalizar la _user_fields parcial (que en realidad no tiene que ser una parcial)

    .nested-fields
      = f.inputs do
        = f.input :name

    Esto debería funcionar.
    Tenga en cuenta que tuve que actualizar el formtastic_cocoon joya, así que usted tendrá que actualizar a la versión 0.0.2.

    Ahora sería fácilmente posible seleccionar el user_type desde un simple menú desplegable que aparece, en lugar de un campo oculto, por ejemplo, el uso

    = f.input :user_type, :as => :select, :collection => ["Participator", "Organizer", "Sponsor"]

    Algunos pensamientos (ahora he comprobado que funciona):

    • esto será siempre crear nuevos usuarios en la marcha, en realidad, eliminando la necesidad de la EventUser. Vas a permitir que la selección de los usuarios existentes en una lista desplegable demasiado?
    • personalmente me gustaría darle la vuelta: permitir que los usuarios se asignan a un evento!
    • Wow! No puedo creer que en realidad resuelto este! Tú eres mi héroe! Muchas gracias!! La razón de por qué el organizador agrega todos los participantes, es que el evento se agrega después del evento, para resolver económicos relacionados con cosas que ocurrieron durante el evento. Sí, voy a agregar que los usuarios existentes! Gracias de nuevo!!
    • ¿Tiene usted alguna idea de cómo agregar user_type a un usuario(existente) seleccionados a partir de un multi-desplegable?
    • En el _event_user_fields parcial i ahora crear automáticamente un nuevo usuario. En lugar de hacer eso, usted podría enlaces: 1 para agregar un nuevo usuario, y 1 para agregar un usuario existente de la lista desplegable. Es que lo suficientemente claro?
    • Usted no quiere echar un vistazo a mi muy similares cuestión ya? stackoverflow.com/questions/11199572/…
  2. 0

    Hace el events_users modelo no tiene una columna de ID? Ya que hay un campo adicional (user_type), a continuación, EventUser es un modelo y probablemente debería tener un IDENTIFICADOR. Tal vez por eso user_type no se establece en el primer caso.

    • He estado tratando con la adición de un ID, pero no hace ninguna diferencia : /
    • Lo extraño es que se esta sobre una actualización, pero no en un crear!

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...