Rails has_many Par polymorphes Checkboxes
-
25-09-2019 - |
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!
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