2009-11-27 7 views
1

J'essaie de développer un wiki avec l'historique des versions. Mon plan est le suivant: chaque fois que j'éditerai un contenu wiki, il devrait être sauvegardé en tant que nouveau.rails, has_one, construire _ # {association}, accepte_nested_attributes_for

pour l'instant, j'ai deux modèles, Wiki et WikiContent, et le code suivant à l'intérieur les:

class Wiki < ActiveRecord::Base 

    has_many :wiki_contents 

    has_one :current_wiki, :class_name => "WikiContent" 
    accepts_nested_attributes_for :current_wiki 

    has_one :new_content, :class_name => "WikiContent" 
    accepts_nested_attributes_for :new_content 

end 
class WikiContent < ActiveRecord::Base 
    belongs_to :wiki 
end 

modèle Wiki a un current_id sur le terrain, de savoir quel contenu est l'actuel.

dans le contrôleur Wiki je lance

def new 
    @wiki.build_current_wiki 
end 
def create 
    @wiki=Wiki.new(params[:wiki]) 
    @wiki.save 
    @[email protected]_wiki.id 
end 

Mais chaque fois que je tente de lancer:

def edit 
    @wiki.build_new_content 
end 

Affecte NULL à current_wiki.wiki_id.

comment puis-je résoudre ce problème? ou existe-t-il un autre moyen de faire fonctionner cela?

+0

Cela ne répond pas à votre question, mais avez-vous jeté un oeil à vestal_versions (http://github.com/laserlemon/vestal_versions)? Il gère les révisions pour vous. – agregoire

Répondre

6

Je pense que vous aurez peut-être plus de facilité si vous redessinez un peu vos modèles.

class Wiki < ActiveRecord::Base 
    has_many :revisions 

    has_one :latest_revision, :class_name => "Revision", :order => 'updated_at desc', :limit => 1 
    accepts_nested_attributes_for :revisions 
end 

class Revision < ActiveRecord::Base 
    belongs_to :wiki 
end 


# new Wiki page, first revision 
def new 
    @wiki = Wiki.new 
    @revision = @wiki.revisions.build 
end 

def create 
    @wiki=Wiki.new(params[:wiki]) 
    @wiki.save 
end 

# adding a Revision to a Wiki page 
def edit 
    @wiki = Wiki.find(params[:id]) 
    @revision = @wiki.revisions.build # creating a new revision on edit 
end 

def update 
    @wiki=Wiki.new(params[:wiki]) 
    @wiki.save 
end 

def show 
    @wiki = Wiki.find(params[:id]) 
    @revision = @wiki.latest_revision 
end 

Un wiki a beaucoup de révisions, mais seulement une dernière révision. Maintenant, vous n'avez pas à gérer current_id, puisque l'association latest_revision s'occupera de cela pour vous.

+0

merci, le code affiché ne fonctionne pas, car la syntaxe 'build' pour has_many est un peu différente de celle pour has_one (f.ex. @ wiki.build_revision doit être @ wiki.revisions.build), mais l'idée de passer à has_many et utilisez "updated_at desc" m'a déplacé quelques pas en avant.je vais garder le current_id cependant, il fait quelques requêtes plus légères –

+0

J'ai mis à jour la syntaxe de construction. –

Questions connexes