【问题标题】:Rails 3 - session's and routing!Rails 3 - 会话和路由!
【发布时间】:2011-02-01 01:55:09
【问题描述】:

我正在构建一个包含多个项目的网络应用程序。通用数据模型是这样的,每个项目都有许多资源,例如文档、寄存器等。大致如下:

class Project < ActiveRecord::Base
  has_many :documents, :registers, :employments
  has_many :users, :through => :employments

class User < ActiveRecord::Base
  has_many :employments
  has_many :projects, :through => :employments

class Document < ActiveRecord::Base
 belongs_to :project

class Register < ActiveRecord::Base
 belongs_to : project

困难来自于路由!!对项目的任何 C UD 操作都将通过命名空间完成。但是,当用户查看项目时,我希望路由中的 project_id 如下:

'0.0.0.0:3000/:project_id/documents/

'0.0.0.0:3000/:project_id/register/1/new

我想过这样的事情:

match '/:project_id/:controller/:id'

我假设我要将 project_id 存储在会话中?如果我放弃这些路线以获得更简单的东西,例如:

"0.0.0.0:3000/documents"

然后如何将任何 CRUD 操作绑定到文档或注册到当前项目?当然,我不必将它硬连接到每个控制器中?

帮助!

【问题讨论】:

    标签: ruby-on-rails-3 routing nested-resources


    【解决方案1】:

    我猜你需要的是嵌套资源。

    resources :projects do
      resources :documents
      resources :registers
    end
    

    现在你会得到这样的路由:

    /projects/:project_id/documents
    /projects/:project_id/registers
    

    您将能够在 DocumentsController 和 RegistersController 中调用 params[:project_id]。您不需要会话来存储 project_id。这将在 url 中提供给您。创建 RESTful 应用程序时应尽可能避免会话。

    您需要做的唯一额外的事情是在两个控制器的创建操作中设置关系:

    def create
      @document = Document.new(params[:document])
      @document.project_id = params[:project_id]
      # Now you save the document.
    end
    

    我喜欢在 ApplicationController 中创建一个辅助方法来获取当前项目。

    class ApplicationController < ActionController::Base
      helper_method :current_project
    
      private
    
      def current_project
        @current_project ||= Project.find(params[:project_id]) if params[:project_id].present?
      end
    end
    

    现在您可以在创建操作中执行以下操作:

    def create
      @document = Document.new(params[:document])
      @document.project = current_project
      # Now you save the document.
    end
    

    您还可以在视图中调用current_project 以获取寄存器和文档。希望对你有所帮助!

    查看 Ruby on Rails 指南以获取有关嵌套资源的更多信息:http://edgeguides.rubyonrails.org/routing.html#nested-resources

    【讨论】:

    • 这听起来不错 - 我已经开始使用会话解决方案,但现在我开始认真地进行第二次猜测。为了避免重嵌套,我假设我打算开始浅嵌套我的资源? IE。用于文档修订、文档类型等。
    • 是的,您不应该过度使用嵌套路由。创建路线变得越来越难。当您想在文档下嵌套某些内容时,您已经通过 de 文档知道它属于哪个项目。因此,无需将其进一步嵌套在您的路由中。但是,您可以这样做。这是你的选择。尽量远离此类问题的会话。 ;)
    猜你喜欢
    • 1970-01-01
    • 2011-09-05
    • 2012-03-21
    • 2013-08-02
    • 2011-08-25
    • 2011-05-11
    • 1970-01-01
    • 2016-09-27
    相关资源
    最近更新 更多