【问题标题】:Rails: Nested Resource Content App Management StructureRails:嵌套资源内容应用程序管理结构
【发布时间】:2011-03-14 11:00:12
【问题描述】:

我是 Rails 新手,正在开发一个内部内容管理应用程序。我做了一个原型,但是感觉很乱,还有更好的方法。我需要以下内容:

我当前的原型使用工作流 (http://github.com/geekq/workflow) 插件来管理项目和主题的状态。我还研究了acts_as_tree 和acts_as_list,但不确定如何最好地构建事物。

========

项目(具有标题、描述、截止日期、工作流程状态)[状态:未发布(如草稿)、已发布(主题可以签入和签出等)、已归档(已完成状态)]

模块(是项目的子项[作为一个组];可以是多个;有标题、描述、内容)

Section(是模块[作为一个组]的子模块;可以是多个;可选的;有标题、描述、 内容)

主题(是部分的子项;可以是多个;可以订购;具有标题、描述、内容、工作流状态、所有者 ID、顺序)[状态:新、已签出、待审核、审核需要、已完成]

进程(是主题的子项;可以是多个;可选;有标题、描述、内容)

资源(是进程的子进程;可以是多个;可选;文件;有标题,resource_link)

--

(还有另外 2 个与项目相关的对象;介绍和基础知识。每个项目只有一个)

简介(是项目的一个子项目;只有一个;有:标题、描述、内容、工作流状态)[状态:同一个主题]

基础(是项目的子项;只有一个;具有:标题、描述、内容、工作流状态)[状态:同一个主题]

注意。我知道其中一些词是保留的,需要使用别名。

========

我希望使用类似于以下的 URL 结构:

/projects/:project_id/modules/:module_id/sections/:section_id/topics/:topic_id/processes/:process_id/resources/:resource_id

或(如果省略部分)

/projects/:project_id/modules/:module_id/topics/:topic_id/processes/:process_id/resources/:resource_id

========

非常感谢任何回复。

更新:Rails 2.3.8

【问题讨论】:

    标签: ruby-on-rails ruby routing nested structure


    【解决方案1】:

    您没有说您使用的是哪个版本的 Rails。为此,我假设版本 2。在您的config/routes.rb 中,您可以像这样设置层级关系:

    ActionController::Routing::Routes.draw do |map|
      map.resources :projects do |projects|
        projects.resources :modules do |modules|
          modules.resources :topics do |topics|
            topics.resources :processes do |processes|
              processes.resources :resources
            end 
          end
        end
      end
    end
    

    Rails 3 路由器具有类似的功能。

    更新:解决以下 cmets 中的其他问题

    此应用程序的关联规则在某种程度上反映了上述路由层次结构。考虑它们的一种方法是查看您在问题中提出的资源 URL。沿着 URL 从左到右阅读可以得到has_many 关系。从右到左阅读会给你belongs_to 关系。例如:

    class Project < ActiveRecord::Base
      has_many :modules
    end
    
    class Module < ActiveRecord::Base
      belongs_to :project
      has_many   :topics
    end
    
    class Topic < ActiveRecord::Base
      belongs_to :module
      has_many   :processes
    end
    

    你可以像这样访问孩子:

    @project.modules
    @module.topics
    @topic.processes
    

    可选部分的问题要求您同时考虑路由以及模式表示和关联。第一个是最简单的。第二个是你需要小心的事情,以免你的建模过度反规范化。路由规则可以修改如下:

    ActionController::Routing::Routes.draw do |map|
      map.resources :projects do |projects|
        projects.resources :modules do |modules|
          modules.resources :sections do |sections|
            sections.resources :topics do |topics|
              topics.resources :processes do |processes|
                processes.resources :resources
              end
            end 
          end
          modules.resources :topics do |topics|
            topics.resources :processes do |processes|
              processes.resources :resources
            end 
          end
        end
      end
    end
    

    【讨论】:

    • 我一直在玩这个设置,但它看起来很乱,如果有更好的方法就好了。它使变量和路径难以处理。
    • 不知道您所说的烦人或凌乱是什么意思。以上规则满足您要求的路线。你能举个例子说明你不喜欢什么以及你想拥有什么吗?
    • 我打算有两个主要观点。查看项目(显示所有子级到主题级别的树状大纲)和查看主题(显示流程和资源)。剩下的只是编辑表格等。这意味着我在部分中使用了许多部分,并且不得不继续向下传递变量。
    • 对于如此深层次的嵌套关系,我也不确定 belongs_to 和 has_many 需要什么。
    • 另外,我不确定这个模型是否允许选择使用某个主题的部分。
    猜你喜欢
    • 2011-01-29
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多