2009-03-06 7 views
1

J'essaie de modéliser un jeu de cartes pour apprendre les Rails. Ceci est différent d'un jeu de cartes standard en ce sens qu'il peut y avoir plusieurs copies d'une carte dans le jeu. Je rencontre des problèmes en essayant d'initialiser le deck. Jusqu'à présent, j'ai un modèle de carte de base avec divers attributs (tels que copies_in_deck) mais aucune association. Un modèle de DeckCard qui représente les cartes dans le jeu (cela est dû à avoir des multiples de la même carte dans le jeu):Comment modéliser et créer un jeu de cartes personnalisé dans des rails?

class DeckCard < ActiveRecord::Base 
    belongs_to :card 
    belongs_to :deck 
end 

Ces DeckCards finira par avoir des attributs reflétant la position; comme dans défausse, en pioche, etc.

Un modèle de plate-forme avec

belongs_to :game 
has_many :deck_cards 

Je suis en train de inialize le pont et je ayant divers problèmes. Je suis en train de la plate-forme suivante dans

def initialize 
    @cards = Card.find(:all) 
    @cards.each do |card| 
    # eventually another loop here on copies_in_deck 
     @deck_cards.build(card) 
    end 
end 

Quand je fais Deck.new je reçois une erreur sur nil.build. Pourquoi @deck_cards est-il nul? J'utilise InstantRails2, qui a des rails 2.0.2. J'ai trouvé this article sur la création de plusieurs modèles en une seule action, j'ai donc essayé d'utiliser Deck.create! à la place, et a obtenu une erreur sur le mauvais nombre d'arguments.

Des suggestions?

Répondre

1
class Deck < ActiveRecord::Base 
    belongs_to :game 
    has_many :deck_cards 

    # To create new: Deck.new.build_deck 
    def build_deck 
    Card.find(:all).each do |card| 
     self.deck_cards << DeckCard.new(:card => card) 
    end 
    end 
end 
+0

Merci, ça l'a fait! Je l'aurais marqué mais je n'ai pas le représentant – user26270

1

Les sous-classes d'ActiveRecord ne doivent pas définir de méthode d'initialisation, car ActiveRecord s'occupe de cela pour vous.

On dirait que vous voulez un enregistrement par carte. Et la DeckCard modèle peut contenir plus d'un paquet de cartes à la fois.

Re: Pourquoi @deck_cards est-il nul? Parce que vous ne l'avez pas défini. @deck_cards est une variable d'instance. Vous essayez d'appeler la méthode de construction, mais vous ne l'avez pas définie. Vous devriez appeler la construction (ou créer ou une nouvelle méthode) sur la DeckCard de classe.

Si vous voulez créer et enregistrer une carte dans le modèle DeckCard:
DeckCard.create (carte) # @ pas deck_cards.build (carte)

Larry

+0

Je suppose que je pensais @deck_cards était la même chose que moi.deck_cards; et j'ai eu la construction de ce que j'avais lu sur les associations et/ou les proxies d'association (peut-être pas le bon terme là) – user26270

0

Ne pas utiliser #initialize sur les objets qui héritent de ActiveRecord :: Base. Ça va casser toutes sortes de magie interne Rails. Au lieu de cela, utilisez le rappel #after_initialize documenté ici: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

Notez que after_initialize est appelé après les recherches ainsi que sur les objets nouvellement créés, donc vous voudrez emballer votre code d'initialisation pour vous assurer que l'objet n'a pas été précédemment enregistré (utilisation #new_record?):

def after_initialize 
    if new_record? 
    # initialize deck_cards here. 
    end 
end 

dans le passé, je l'ai adopté cette approche alternative avec une syntaxe plus agréable, mais attention qu'il ne démarre pas avant que vous essayez d'enregistrer ou de valider la record.

before_validation :build_default_associations, :if => :new_record? 

def build_default_associations 
    # initialize default associations here. 
end 
Questions connexes