5

¡Esta me está deprimiendo! :(Rails tiene muchas cajas de verificación polimórficas

que estoy tratando de hacer una forma anidada modelo para mi modelo de usuario con la lista pulsando en ella donde múltiples tiendas pueden ser activada o desactivada para administrar los almacenes a través del modelo de personal.

class Staffing < ActiveRecord::Base 
    # Associations 
    belongs_to :user 
    belongs_to :staffable, :polymorphic => true 
    belongs_to :store,  :class_name => "Store", 
         :foreign_key => "staffable_id" 
end 

class User < ActiveRecord::Base 
    # Includes 
    acts_as_authentic 

    # Associations 
    has_many :staffings, :dependent => :destroy 
    has_many :stores, :through => :staffings 

    # Nested Attributes 
    accepts_nested_attributes_for :staffings, :allow_destroy => true 
end 

class Store < ActiveRecord::Base 
    # Associations 
    has_many :staffings, :as => :staffable, :dependent => :destroy 
    has_many :users, :through => :staffings 
end 


# Users Controller 
def create 
    @user = User.new(params[:user]) 
    flash.now[:notice] = "#{@user.name} was successfully created." if @user.save 
    respond_with @user 
end 


def update 
    @user = User.find(params[:id]) 
    params[:user][:store_ids] ||= [] 
    @user.update_attributes(params[:user]) 
    flash.now[:notice] = "#{@user.name} was successfully updated." 
    respond_with @user 
end 

Para los efectos en la mano de la otra asociación staffable puede ser ignorada. es un modelo similar que me finalmente desea administrar junto Store pero primero que del primero ya que estoy tan confundido como es.

# User Form 
- for store in Store.all 
    %p 
    = check_box_tag "user[store_ids][]", store.id, @user.stores.include?(store) 
    = store.nickname 

Envía mis params junto como tal:

{"utf8"=>"✓", 
"authenticity_token"=>"blub-blub-blub=", 
"user"=>{"login"=>"hey.buddy", 
"email"=>"[email protected]", 
"role"=>"admin", 
"hq"=>"1", 
"password"=>"[FILTERED]", 
"password_confirmation"=>"[FILTERED]", 
"store_ids"=>["3", 
"4"]}} 

Y luego ERROR!

Mysql2::Error: Column 'staffable_type' cannot be null: INSERT INTO `staffings` (`created_at`, `staffable_id`, `staffable_type`, `updated_at`, `user_id`) VALUES ('2010-11-17 00:30:24', 3, NULL, '2010-11-17 00:30:24', 102) 

Yo sé que tengo que construir staffable_type como 'tienda', pero yo he estado tratando durante todo el día - ¿cuál es el truco?

Tengo las columnas staffable_type (y id) establecidas en: null => false, pero eso no puede ser la causa de esto, ya que es necesario enderezarlo en el controlador antes de pulsar el DB de todos modos.

¿Por qué el siguiente no funciona en mi acción create:

@user.staffings.each do |s| 
    s.staffable_type = 'Store' 
end 

o:

@user.store_ids.each do |i| 
    s = @user.staffings.build 
    s.staffable_type = 'Store' 
    s.staffable_id = i 
end 

Si ha de probar muchas cosas similares a las anteriores en vano. Cualquier ayuda sería apreciada masivamente.

¡Gracias por su tiempo!

Respuesta

4

Bien, pensé que esto saldría. Estoy respondiendo aquí, así que espero poder ayudar a alguien algún día, pero el problema fue una supervisión básica de la diferencia entre Has Many Through y Has And Belongs to Many Associations.

Usted, si desea manejar casillas de verificación o listas de selección múltiple en Has Many Through, no hay ningún método '_ids' generado por la asociación y necesita escribir uno para usted. Artículo

Véase Paul Barry aquí: http://paulbarry.com/articles/2007/10/24/has_many-through-checkboxes

cosas polimórfica puede ser complicado, pero si usted es bien real atascado tal vez dar un paso atrás y asegúrese de que no es algo aún más básico que está jugando up-- ¡trabajó para mi!

A continuación se muestra el código modificado del blog de Pablo sobre la manera de manejar esto si usted está tratando con un polimórfica tiene muchos a través de (básicamente sólo tiene que utilizar el hash atributos y escribir su atributo polymorphic_type):

attr_accessor :store_ids 
after_save :update_stores 

#after_save callback to handle group_ids 
def update_stores 
    unless store_ids.nil? 
    self.staffings.each do |staffing| 
     staffing.destroy unless store_ids.include?(staffing.staffable_id.to_s) 
     store_ids.delete(staffing.staffable_id.to_s) 
    end 
    store_ids.each do |s| 
     self.staffings.create(attributes = {:staffable_id => s, :staffable_type => 'Store'}) unless s.blank? 
    end 
    reload 
    self.store_ids = nil 
    end 
end 
Cuestiones relacionadas