Question

J'essaie de développer un wiki avec l'historique des versions.

Mon plan est le suivant: chaque fois que je modifie un contenu wiki, il doit être enregistré sous un nouveau.

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

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

Le modèle Wiki a un champ current_id, pour savoir quel contenu est le contenu actuel.

dans le contrôleur de wiki, je lance

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

Mais chaque fois que j'essaie de courir:

def edit
  @wiki.build_new_content
end

il affecte NULL à current_wiki.wiki_wiki.

comment puis-je résoudre ce problème? ou y a-t-il un autre moyen d'obtenir que cela fonctionne?

Était-ce utile?

La solution

Je pense que vous aurez peut-être plus de facilité si vous modifiez 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 de nombreuses révisions, mais seulement une dernière. Maintenant, vous n'avez plus à gérer current_id , car l'association latest_revision s'en chargera pour vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top