Условная маршрутизация Ruby on Rails - PullRequest
1 голос
/ 18 ноября 2009

У меня есть сайт с множеством вакансий, но я также хочу, чтобы каждая учетная запись могла иметь доступ к своим вакансиям в одном месте. Таким образом, я использую эти маршруты:

map.resources :jobs
map.resource :account, :has_many => :jobs

Это дает мне URL-адреса, такие как localhost/jobs/ и localhost/account/jobs. Тем не менее, оба, кажется, делают JobsController::index. Как можно сделать условие в действии индекса (как получить доступ к тому, была ли указана учетная запись / задания или только задания в URL-адресе?) Или изменить маршрут учетной записи для выполнения другого действия? Как правильно это сделать?

Ответы [ 3 ]

3 голосов
/ 18 ноября 2009

Вы можете использовать блок при создании маршрутов, а затем передать параметр :controller, например,

map.resource :account do |account|
  # If you have a special controller 'AccountJobsController'
  account.resources :jobs, :controller => "account_jobs"
end

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

map.resource :account do |account|
  account.resources :jobs, :controller => "accounts/jobs"
end

Если вы используете приведенный выше фрагмент, вам следует создать контроллер в app / controllers / accounts / jobs_controller.rb, который определяется следующим образом:

class Account::JobsController < ApplicationController
  ##
  ## etc.
  ##
end

Вы всегда можете использовать rake routes, чтобы проверить, какие маршруты были сгенерированы и какие контроллеры они будут использовать.

2 голосов
/ 18 ноября 2009

Добавление требования к определению ресурса позволяет передавать дополнительные параметры

map.resources :jobs
map.resource :account, :has_many => :jobs, :requirements => {:account => true}

Тогда params[:account] будет установлено, если URL-адрес маршрутизации был 'http://www.mysite.tld/account/jobs', и не установлено, если это было' http://www.mysite.tld/jobs'

Как и во всех остальных маршрутизациях, действие зависит от контекста.

  • GET-запросы без идентификатора маршрута к индексу.
  • GET запросы с идентификатором маршрута для отображения
  • POST запрашивает маршрут для создания
  • PUT запрашивает маршрут для обновления
  • DELETE запрашивает маршрут для уничтожения.
0 голосов
/ 18 ноября 2009

Если вы запускаете «рейк-маршруты», вы должны увидеть что-то вроде этого

account_jobs  GET    /accounts/:account_id/jobs/:job_id    {:controller => 'jobs', :action => 'index'}

Это означает, что когда ваше действие вызывается по маршруту / account / jobs, у вас должен быть параметр: account_id. Затем вы можете выполнить логическое переключение, основываясь на существовании этого параметра:

if params[:account_id].nil?
   ...
else
   ...
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...