Rails 3 - 会话和路由!

时间:2011-02-01 01:55:09

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

我正在构建一个包含多个项目的Web应用程序。一般数据模型是这样的,每个项目都有许多资源,如文档,寄存器等。有类似的东西:

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 /

OR

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

我想到了类似的东西:

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

我认为我要将project_id存储在会话中?如果我放弃这些简单的路线,例如:

"0.0.0.0:3000/documents"

如何将任何CRUD操作绑定到当前项目的文档或寄存器?当然,我不需要将其硬连接到每个控制器上?

HELP!

1 个答案:

答案 0 :(得分:0)

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

resources :projects do
  resources :documents
  resources :registers
end

现在你将获得这样的路由:

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

您可以在DocumentsController和RegistersController中调用params[:project_id]。您不需要会话来存储project_id。这将在网址内提供。创建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 action中执行以下操作:

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