不久前,我在 paper_trail gem 上的这个 railscasts 中实现了一个“撤消”和“重做”按钮。直到今天“重做”停止工作时,一切都很好。我一直无法弄清楚为什么。
这是相关的控制器操作:
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 在表中找到对应的版本。
我无法弄清楚这里出了什么问题,因此将不胜感激任何帮助。