Ruby on rails 3 Rails 3-会话和路由!
我正在构建一个包含多个项目的web应用程序。通用数据模型是这样的:每个项目都有许多资源,如文档、注册表等。这些资源大致如下:Ruby on rails 3 Rails 3-会话和路由!,ruby-on-rails-3,routing,nested-resources,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 :employ
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
我想到了这样的事情:
match '/:project_id/:controller/:id'
我假设我要将项目id存储在会话中?如果我为了更简单的事情放弃这些路线,比如:
"0.0.0.0:3000/documents"
那么,如何将任何CRUD操作绑定到当前项目的文档或注册表??我当然不必把它硬连接到每个控制器上
救命啊 我想您需要的是嵌套资源
resources :projects do
resources :documents
resources :registers
end
现在,您将获得如下路由:
/projects/:project_id/documents
/projects/:project_id/registers
您可以在DocumentsController和RegistersController中调用params[:project_id]。您不需要会话来存储项目id。这将在url中提供给您。创建RESTful应用程序时,应尽可能避免会话
您需要做的唯一额外的事情是在两个控制器的创建操作中设置关系:
def create
@document = Document.new(params[:document])
@document.project_id = params[:project_id]
# Now you save the document.
end
我喜欢做的是在ApplicationController中创建一个helper方法来获取当前项目
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
您还可以在视图中调用当前的_项目以获取注册表和文档。希望这能帮到你
查看RubyonRails指南,了解有关嵌套资源的更多信息:听起来不错-我已经开始使用会话解决方案,但现在我开始认真地进行二次猜测。为了避免繁重的嵌套,我想我应该开始浅嵌套我的资源?例如,对于文档修订、文档类型等,是的,您不应该过度嵌套路由。创建路线变得越来越困难。当您想要在文档下嵌套某些内容时,您已经通过de document知道它属于哪个项目。因此,不需要在路由中进一步嵌套它。但是你可以做到。这是你的选择。试着远离这类问题的惩罚;
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