2011-02-01 12 views
1

私は複数のプロジェクトを持つWebアプリケーションを構築しています。一般的なデータモデルは、各プロジェクトが文書、レジスタなどの多くのリソースを持っているようなものです。Rails 3 - セッションとルーティング!

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アクションは、ネームスペースを通じて実行されます。私が思った

「0.0.0.0:3000/:project_id/documents/

OR

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

:ユーザーがプロジェクトを見ているときしかし、私はそのようなことのルートでPROJECT_IDをしたいです次のようなものについて:

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

私はセッションでproject_idを保存しますか?私はsimplierなだけのような何かのためにこれらのルートを見合わせる場合:

"0.0.0.0:3000/documents" 

どのように私は、現在のプロジェクトに文書またはレジスタに任意のCRUDアクションにバインドするのです?確かに、これをすべてのコントローラーにハードワイヤ接続する必要はありませんか?

HELP!

答えて

0

ネストされたリソースが必要です。

resources :projects do 
    resources :documents 
    resources :registers 
end 

は今、あなたはこのように、ルーティング得られます。

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

あなたがDocumentsControllerとRegistersController内params[:project_id]を呼び出すことができるでしょう。 project_idを保存するセッションは必要ありません。これはURLの中で利用可能になります。 RESTfulアプリケーションを作成するときは、できるだけセッションを避ける必要があります。

あなたがする必要がある唯一の余分なものは、両方のコントローラのアクションを作成内部関係に設定されています。現在のプロジェクトを取得しますApplicationControllerに内部のヘルパーメソッドを作成している私は何をしたいと

def create 
    @document = Document.new(params[:document]) 
    @document.project_id = params[:project_id] 
    # Now you save the document. 
end 

を。

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 

ます。また、レジスタやドキュメントのために、あなたの意見の内側current_projectを呼び出すことができるでしょう。それがあなたを助けることを願っています! Ruby on Railsには、ネストされたリソース上でいくつかの詳細については、案内

チェック:http://edgeguides.rubyonrails.org/routing.html#nested-resources

+0

良い音 - 私はセッションを使用して解決に向けて作業を開始していたが、今、私は真剣に二推測し始めています。重いネストを避けるため、私は自分のリソースを浅くネスティングすることを意味していますか?すなわち、ドキュメントの改訂、ドキュメントの種類など –

+0

ええ、あなたはネストされたルーティングを過度にしてはいけません。あなたのルートを作成するのが難しくなります。ドキュメントの下に何かをネストしたいときは、ドキュメントを介してどのプロジェクトに属しているのかをすでに知っています。したがって、ルーティング内でそれをさらにネストする必要はありません。しかし、あなたはそれを行うことができます。それはあなたの選択です。これらのタイプの問題については、セッションから離れてください。 ;) – RobinBrouwer

関連する問題