Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 Rails 3-会话和路由!_Ruby On Rails 3_Routing_Nested Resources - Fatal编程技术网

Ruby on rails 3 Rails 3-会话和路由!

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

我正在构建一个包含多个项目的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
我想到了这样的事情:

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