我正在尝试修改vestal_versions插件以接受我在保存时设置的参数。此参数将充当新标志,以确定何时在更新时创建修订。目前,当需要新版本时,它将始终在更新时运行。以下是未修改的插件代码的受影响区域:
after_update :create_version, :if => :needs_version?
def create_version
versions.create(:changes => changes.slice(*versioned_columns), :number => (last_version + 1))
reset_version
end
我在提交时在视图中发送的参数是“forcerevision = n”。我将如何引入此参数以及我将使用什么条件来允许它仅在“forcerevision = y”时运行?修改after_update过滤器似乎最干净了吗?
以下是更新时传递的数据的日志。
Processing NotesController#update (for 521.0.0.1 at 2009-12-05 13:25:45) [PUT]
Parameters: {"authenticity_token"=>"#########################+k=", "id"=>"4", "forcerevision"=>"n", "note"=>{"notebook_id"=>"", "public"=>"n", "body"=>"A versioned note", "title"=>"Version Note Test", "flag"=>"important", "star"=>"false", "tag_list"=>""}}
答案 0 :(得分:0)
最简单的方法是在声明模型版本化时添加attr_accessor。
然后覆盖needs_version?检查该属性。
LaserLemon中的任何地方:: VestalVersions :: ClassMethods#versioned添加以下行:
attr_accessor :force_reversion
然后重写LaserLemon :: VestalVersions :: InstanceMethods#needs_version?检查此属性:
N.B。由于处理复选框的方式,对于复选框和布尔字段,“0”被认为是假的,但在ruby中是真值。所以我们不能只检查force_reversion是否评估为false。
def needs_version?
!(versioned_columns & changed).empty? ||
![nil, "0", 0, false].include?(force_reversion)
end
你们都准备好了。只需传递force_reversion的任何值,就像它是一列一样。
使用以下模型进行上述更改后:
类用户
@user.update_attributes(:force_reversion => true, :unversioned_column => new_value)
或表格形式:
<%= form_for @user do |f| %>
<%= f.label :force_reversion, "Force New Version" %>
<%= f.check_box :force_reversion %>
... More fields ...
<% end %>