Rails 3 - сессия и маршрутизация! - PullRequest
1 голос
/ 01 февраля 2011

Я создаю веб-приложение, в котором есть несколько проектов. Общая модель данных такова, что каждый проект имеет много ресурсов, таких как документы, регистры и т. Д. Что-то вроде:

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

Трудность связана с маршрутизацией! Любые действия CDD над проектами будут выполняться через пространство имен. Однако, когда пользователь просматривает проект, я хочу, чтобы project_id в маршрутах был таким, что:

0.0.0.0: 3000 /: project_id / документы /

OR

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

Я думал о чем-то вроде:

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

Полагаю, мне нужно сохранить идентификатор_проекта в сеансе? Если я откажусь от этих маршрутов для чего-то более простого, например:

"0.0.0.0:3000/documents"

Как мне затем связать любые действия CRUD с документами или регистрами для текущего проекта? Конечно, мне не нужно жестко подключать это к каждому контроллеру?

HELP!

1 Ответ

0 голосов
/ 01 февраля 2011

Полагаю, вам нужны вложенные ресурсы.

resources :projects do
  resources :documents
  resources :registers
end

Теперь вы получите маршрутизацию следующим образом:

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

Вы сможете звонить params[:project_id] внутриDocumentsController и RegistersController.Вам не понадобится сеанс для сохранения идентификатора проекта.Это будет доступно вам внутри 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

...