前一段时间,我实施了一个"撤消"和"重做"像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在表中找到相应的版本。
我无法弄清楚这里有什么问题,所以任何帮助都会非常感激。
答案 0 :(得分:0)
对于后来发现此问题的任何人,我遇到的问题是我的条件(@version.reify
)的第一个陈述从未返回nil。这是因为我覆盖了对象属性以添加其他信息来创建事件。为了解决这个问题,我只是改变条件来检查事件的类型,即
if @version.event == "create"
...
end
PaperTrail的reify方法查看object
的{{1}}属性,并从序列化中重新创建对象。只要对象字段为nil,它就返回nil,否则它将返回它未序列化的对象。