1

複数のプロジェクトを持つ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

ルーティングには難しさがあります!! プロジェクトに対するCUDアクションは、名前空間を介して実行されます。ただし、ユーザーがプロジェクトを表示しているときは、次のようなルートにproject_idが必要です。

'0.0.0.0:3000/:project_id/documents/

また

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

私は次のようなことを考えました:

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

project_idをセッションに保存すると思いますか?私がこれらのルートを忘れて、次のような単純なものにした場合:

"0.0.0.0:3000/documents"

次に、CRUDアクションをドキュメントにバインドしたり、現在のプロジェクトに登録したりするにはどうすればよいですか?確かに、これをすべてのコントローラーに配線する必要はありませんか?

ヘルプ!

4

1 に答える 1

0

必要なのはネストされたリソースだと思います。

resources :projects do
  resources :documents
  resources :registers
end

これで、次のようなルーティングが得られます。

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

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

追加で必要なのは、両方のコントローラーの create アクション内で関係を設定することだけです。

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 アクション内で次のことができます。

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

于 2011-02-01T19:09:36.873 に答える