5

Ten naprawdę mnie przygnębia! :(Rails ma wiele poprzez poliformowe checkboxy

Próbuję zrobić zagnieżdżonych wzoru formularza do mojego modelu użytkownika z listy wyboru w nim liczne sklepy, gdzie można sprawdzić czy niesprawdzony administrować sklepach poprzez modelu Staffing.

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 

Dla cele pod ręką drugi stowarzyszenie staffable można zignorować. jest to podobny model, że będę w końcu chcą administrować obok sklepu, ale pierwszą rzeczą, najpierw ponieważ jestem tak zakłopotany, jak to jest.

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

Wysyła moje params jako takie:

{"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"]}} 

A następnie 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) 

wiem, muszę zbudować staffable_type jako „Store” ale starałem cały dzień - co to za sztuczka?

Mam kolumny staffable_type (i id) ustawione na: null => false, ale to nie może być przyczyną tego, ponieważ trzeba to wyprostować w kontrolerze przed kliknięciem DB.

Dlaczego nie poniżej pracować w moim stworzenia działania:

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

czyli

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

Jeśli próbuje wiele rzeczy podobnych do powyższego bezskutecznie. Każda pomoc będzie ogromnie ceniona.

Dziękujemy za poświęcony czas!

Odpowiedz

4

Okej, wymyśliłem to. Odpowiadam tutaj, więc mam nadzieję, że kiedyś pomogę komuś, ale problem był podstawowym niedopatrzeniem w kwestii różnicy między hasłem "Wiele się ziło i ma i należy do wielu stowarzyszeń".

Jeśli chcesz obsługiwać pola wyboru lub listy wielokrotnego wyboru w hasłach Wiele przez, nie istnieje żadna metoda "_ids" wygenerowana przez stowarzyszenie i musisz ją napisać dla siebie. artykuł tutaj

zobaczyć występ Paul Barry'ego: http://paulbarry.com/articles/2007/10/24/has_many-through-checkboxes

polimorficzne rzeczy może być skomplikowane, ale jeśli utkniesz prawdziwe dobro może cofnąć się o krok i upewnić się, że nie jest coś jeszcze bardziej podstawowy, który jest brudząc ci up-- pracował dla mnie!

Poniżej znajduje się kod modyfikowany blogu Pawła o tym, jak sobie z tym poradzić, jeśli masz do czynienia z polimorficzny ma wiele do (w zasadzie wystarczy użyć skrótu atrybutów i napisać swój atrybut 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 
Powiązane problemy