Question

Celui-ci m'a vraiment obtenir vers le bas! :(

Je suis en train de faire un modèle de formulaire imbriqué pour mon modèle utilisateur avec une liste de cases à cocher dans plusieurs magasins où il est possible de vérifier ou sans contrôle pour administrer les magasins grâce à un modèle de dotation.

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

Aux fins à la main l'autre association staffable peuvent être ignorées. Il est un modèle similaire que je finirais veux administrer le long magasin mais d'abord chose est d'abord parce que je suis tellement déconcerté qu'il est.

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

Envoie mes params le long en tant que tel:

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

Et puis ERREUR!

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)

Je sais que je dois construire des staffable_type comme « magasin », mais je l'ai essayé toute la journée - ce qui est l'affaire

?

Je l'ai staffable_type (et id) colonnes modifiee:. Null => false, mais qui ne peut pas être la cause de ce que cela doit être redressé dans le contrôleur avant de frapper le DB de toute façon

Pourquoi le ci-dessous fonctionne pas dans mon action de création:

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

ou

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

Si essayé beaucoup de choses semblables à ce qui précède sans succès. Toute aide serait massivement apprécié.

Merci pour votre temps!

Était-ce utile?

La solution

D'accord, je pensais que celui-ci dehors. Je réponds ici, donc je espère pouvoir aider quelqu'un un jour, mais le problème était un contrôle de base sur la différence entre A et A travers Beaucoup Et Appartient à de nombreuses associations.

Si vous souhaitez gérer cases à cocher ou des listes MultiSelect dans un a beaucoup de travers, il y a la méthode pas '_ids de produit pour vous par l'association et vous avez besoin d'écrire un pour vous.

Voir l'article de Paul Barry ici: http://paulbarry.com/articles/2007/10/24/has_many -Grâce- des cases à cocher

choses polymorphes peut être compliqué, mais si vous êtes vraiment bien coincé peut-être faire un pas en arrière et assurez-vous que ce n'est pas quelque chose d'encore plus fondamental qui est vous déconner up-- travaillé pour moi!

est en dessous du code modifié du blog de Paul sur la façon de gérer cela si vous avez affaire à un polymorphes a beaucoup à (fondamentalement, vous avez juste besoin d'utiliser le hachage d'attributs et d'écrire votre attribut 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 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top