rails、has_one、build _#{association}、accepts_nested_attributes_for
-
05-07-2019 - |
質問
バージョン履歴付きの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
を管理する必要はありません。
所属していません StackOverflow