0

为 Rails 应用程序实现版本控制我希望有一个视图来显示模型的所有版本,并带有一些额外的功能,如还原等。我使用paper_trailgem 进行版本控制。

我知道我可以通过versions为每个模型编写一个控制器函数和一个视图来做到这一点,但我想一次为所有模型做这件事。这应该是可能的,因为model.versions属性的结构总是相同的。

/pages/testpage/versions理想情况下,URL 应该testpage是页面 id 的样子。

这似乎类似于 rails 中嵌套路由的概念。

resources :pages do                                                    
    resources :versions                                                  
end

然而,嵌套路由的问题是:

  • 每个型号都需要额外配置
  • testpage在不知道它是哪个模型的情况下,我无法访问该对象。我也无法找到确定模型的方法,因为提供给我的版本控制器的唯一东西是参数哈希。

我完全愿意接受可能不符合我最初想法的替代解决方案。

4

2 回答 2

1

将其写入您的ApplicationController并将其定义为 helper_method。

例如

class ApplicationController < ActionController::Base
  helper_method :current_time

  def current_time
    Time.now
  end
end

现在您可以current_time在控制器或视图中到处调用。

您也可以编写单独的模块/类并在那里定义您的辅助方法。比您也应该将此文件包含在您ApplicationController

更改主题后的UPD

我没有考虑你的实际问题。但我可以说你的方法在这里是最好的。

您应该创建新资源,而不是创建难以测试的新功能。因此,创建新资源(控制器):版本并围绕此控制器进行操作。

例如它是如何工作的:

/versions/pages/132
/versions/comments/1003

如何实现:

match "/versions/:model/:id", :to => "versions#index"

在您的控制器中:

class VersionsController < ActionController::Base
  def index
    @object = my_type.find(params[:id])
    @versions = @object.versions
  end

  private
  def my_type
    params[:model].constantize
  end
end

当然,您可以按照自己的方式更改路线:

match "/:model/:id/versions", :to => "versions#show"

所以现在你的漂亮/pages/testpage/versions对你来说会很好,没有任何新的奇怪逻辑。

更新 2

想象一下你有这条路线:

match "/:model/:id/versions", :to => "versions#index", :as => :versions

这个对象:

@page = Page.last
@hotel = Hotel.find(123)
@comment = @page.comments.first

我们将如何为版本创建链接:

<%= link_to "Versions of this page", versions_path(:model => @page.class.to_s, :id => @page.id) %>
<%= link_to "Versions of this hotel", versions_path(:model => @hotel.class.to_s, :id => @hotel.id) %>
<%= link_to "Versions of this comment", versions_path(:model => @comment.class.to_s, :id => @comment.id) %>
于 2011-04-20T13:47:01.840 回答
0

我建议传递一个参数,例如“type”并将模型名称填充在那里。然后在您的控制器中,您可以执行以下操作:

class VersionsController < ApplicationController
  def index
    model = params[:type].classify.constantize
    @obj = model.find(params[:id])
  end
end

对于您的链接,您可以将查询传递给 link_to 助手

<%= link_to versions_path(@model, :type => @model.class) %>

或类似的规定。

于 2011-04-20T15:02:17.193 回答