rails,has_one,build _#{association},accepts_nested_attributes_for

时间:2009-11-27 11:41:57

标签: ruby-on-rails has-one

我正在尝试使用版本历史开发维基。

我的计划是:每次编辑维基内容时,都应该保存为新内容。

现在,我有两个模型,Wiki和WikiContent,并在其中包含以下代码:

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。

我该如何解决这个问题? 还是有另一种方法让它发挥作用?

1 个答案:

答案 0 :(得分:6)

如果您稍微重新设计模型,我认为您可能会有更轻松的时间。

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有许多修订版,但只有一个最新修订版。现在您无需管理current_id,因为latest_revision协会将为您处理此问题。