質問

バージョン履歴付きのwikiを開発しようとしています。

私の計画は:Wikiコンテンツを編集するたびに、新しいコンテンツとして保存されることです。

今のところ、WikiとWikiContentの2つのモデルがあり、その中に次のコードがあります:

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モデルには、現在のコンテンツがどれであるかを知るためのcurrent_idフィールドがあります。

実行中のWikiコントローラー

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

しかし、実行しようとするたびに:

def edit
  @wiki.build_new_content
end

current_wiki.wiki_idにNULLを割り当てます。

どうすれば修正できますか? またはこれを機能させる別の方法がありますか?

役に立ちましたか?

解決

少しモデルを再設計する方が楽かもしれません。

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

Wikiには多くの改訂がありますが、最新の改訂は1つしかありません。 latest_revision の関連付けが自動的に処理するため、 current_id を管理する必要はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top