“重做”突然失败了。

时间:2014-07-28 21:07:43

标签: ruby-on-rails paper-trail-gem

前一段时间,我实施了一个"撤消"和"重做"像this railscasts on the paper_trail gem中的按钮。一切都很好,直到今天重做"重做"停止工作。我还没弄清楚原因。

以下是相关的控制器操作:

  def revert
  @version = PaperTrail::Version.find(params[:id])
    if @version.reify
      @version.reify.save!(:validate => false)
      view_context.reify_associations(@version)
    else
      @version.item.destroy
    end
    link_name = params[:redo] == "true" ? "undo" : "redo"
    link = view_context.link_to(link_name, revert_version_path(@version.next, :redo => !params[:redo]), :method => :post)
    if @version.event == "create"
      flash[:success] = "Undid #{@version.event}. #{link}"
      redirect_to :controller => session[:controller], action: :index
    else
      flash[:success] = "Undid #{@version.event}. #{link}"
      redirect_to :back
    end

  end

它失败了:link = view_context.link_to(link_name, revert_version_path(@version.next, :redo => !params[:redo]), :method => :post)

出现错误:ActionController:UrlGenerationError ... No route matches {:action=>"revert", :controller=>"versions", :format=>nil, :id=>nil, :redo=>false} missing required keys: [:id]
所以,显然,我按照错误来看看为什么:id没有被传入,但确实如此。

参数:

{"_method"=>"post", "authenticity_token"=>"6/B1YDXqZ62+DqMMdcYTfCTIJGaVvc1RjKmxWW2GkeQ=", "redo"=>"true", "id"=>"29"}

明确定义了id,并且该控制器的第一行根据该id在表中找到相应的版本。

我无法弄清楚这里有什么问题,所以任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

对于后来发现此问题的任何人,我遇到的问题是我的条件(@version.reify)的第一个陈述从未返回nil。这是因为我覆盖了对象属性以添加其他信息来创建事件。为了解决这个问题,我只是改变条件来检查事件的类型,即

if @version.event == "create"
...
end

PaperTrail的reify方法查看object的{​​{1}}属性,并从序列化中重新创建对象。只要对象字段为nil,它就返回nil,否则它将返回它未序列化的对象。