2011-02-01 7 views
1

Я создаю веб-приложение, которое имеет несколько проектов. Общая модель данных такова, что каждый проект имеет много ресурсов, такие как документы, регистры, etc.Something вдоль линий: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 для проектов будут выполняться через пространство имен. Однако, когда пользователь просматривает проект, я хочу 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 действия документов или регистров текущего проекта ?? Неужели мне не нужно жестко подключать это к каждому контроллеру?

ПОМОЩЬ!

ответ

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.

Единственное дополнение, что вам нужно сделать, это установление отношений внутри создания действия обоих контроллеров:

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 

Теперь вы можете сделать следующее внутри создания действия:

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

Вы также будете иметь возможность вызывать current_project внутри ваших взглядов для регистров и документов. Надеюсь, что это поможет!

Проверь Рубин на Rails руководство для более подробной информации о вложенных ресурсах: http://edgeguides.rubyonrails.org/routing.html#nested-resources

+0

Это звучит хорошо - я начал работать в направлении решения с использованием сессий, но теперь я начинаю всерьез вторая догадку. Чтобы избежать тяжелого гнезда, я полагаю, что тогда я должен начать мелкие вложения моих ресурсов? то есть. для пересмотра документов, типов документов и т. д. –

+0

Да, вы не должны переусердствовать вложенной маршрутизации. Вам просто становится сложнее создавать маршруты. Когда вы хотите что-то вложить в документы, вы уже знаете, к какому проекту он принадлежит через документ.Поэтому не нужно больше вставлять его в вашу маршрутизацию. Но вы можете это сделать. Это твой выбор. Просто старайтесь держаться подальше от проблем для этих проблем. ;) – RobinBrouwer

Смежные вопросы