2011-04-20 58 views
0

实现Rails应用程序的版本控制我想要一个视图来显示具有一些额外功能(如还原等)的所有版本的模型。 我使用paper_trail版本的宝石。如何定义适用于任何型号实例的控制器功能

我知道我可以通过编写像versions这样的控制器功能和每个模型的视图来实现这一点,但我希望一次完成所有模型。这应该是可能的,因为model.versions属性始终构造相同。

理想情况下,网址应该看起来像/pages/testpage/versions,而testpage是网页ID。

这似乎与rails中嵌套路由的概念类似。然而

resources :pages do              
    resources :versions             
end 

具有嵌套的路由的问题是:每模型

    • 需要额外的配置,我不能无需知道哪个模型是一个实例的访问testpage对象。 我也无法找到一种方法来确定模型,因为唯一提供给我的版本控制器的是params散列。

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

  • 回答

    1

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

    例如

    class ApplicationController < ActionController::Base 
        helper_method :current_time 
    
        def current_time 
        Time.now 
        end 
    end 
    

    现在你可以在任何地方控制器或意见CAL 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将适合你,没有任何新的奇怪的逻辑。

    UPD 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) %> 
    
    +0

    也许我只是不明白,但这似乎并没有解决我的问题。我稍微改变了这个问题,希望现在更清楚。 – 2011-04-20 13:53:41

    +0

    是的。现在这是另一个问题:) – fl00r 2011-04-20 13:54:28

    +0

    对不起。完成描述后,我忘了回顾这个问题。 – 2011-04-20 13:55:24

    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) %> 
    

    或者类似的规定。

    +0

    它只是一样的想法:) – fl00r 2011-04-20 15:05:29

    相关问题