Pav*_* K. 1 ruby-on-rails has-one
我正在尝试使用版本历史开发一个wiki.
我的计划是:每次编辑维基内容时,都应该保存为新内容.
现在,我有两个模型,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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
但每当我尝试运行:
def edit
@wiki.build_new_content
end
Run Code Online (Sandbox Code Playgroud)
它为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
Run Code Online (Sandbox Code Playgroud)
Wiki有许多修订版,但只有一个最新修订版.现在您无需管理current_id,因为latest_revision协会将为您处理.
| 归档时间: |
|
| 查看次数: |
4200 次 |
| 最近记录: |