1

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

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 操作绑定到文档或注册到当前项目?当然,我不必将它硬连接到每个控制器中吗?

帮助!

4

1 回答 1

0

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

resources :projects do
  resources :documents
  resources :registers
end

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

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

您将能够params[:project_id]在 DocumentsController 和 RegistersController 中调用。您不需要会话来存储 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

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

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

于 2011-02-01T19:09:36.873 回答