Schienen, has_one, bauen _ # {Verein}, accepts_nested_attributes_for
-
05-07-2019 - |
Frage
Ich versuche, ein Wiki mit Versionsgeschichte zu entwickeln.
mein Plan ist: jedes Mal, wenn ich einen Wiki Inhalt bearbeiten, soll es als einen neuen gerettet werden
.für jetzt, ich habe zwei Modelle, Wiki und wikicontent und folgenden Code in ihnen:
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
Wiki-Modell hat ein Feld current_id, zu wissen, welche Inhalte die aktuelle ist.
in der Wiki-Controller i run
def new
@wiki.build_current_wiki
end
def create
@wiki=Wiki.new(params[:wiki])
@wiki.save
@wiki.current_id=@wiki.current_wiki.id
end
Aber wenn ich versuche zu laufen:
def edit
@wiki.build_new_content
end
es weist NULL current_wiki.wiki_id.
Wie kann ich beheben, dass? oder gibt es eine andere Möglichkeit, dies Arbeit zu kommen?
Lösung
Ich denke, man kann es leichter haben, wenn Sie Ihre Modelle ein bisschen wieder entwerfen.
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
Ein Wiki hat viele Revisionen, hat aber nur eine letzte Revision. Jetzt müssen Sie nicht current_id
verwalten, da die latest_revision
Verein kümmern, dass für Sie brauchen.