我正在构建一个包含多个项目的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!
答案 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