2012-03-22 3 views
3

В routes.rb,Rails 3 - Как изменить параметр: идентификатор ресурсов

resources :projects

дает следующие маршруты

/projects/ 
/projects/:id 

При использовании вложенных ресурсов, как

resources :projects do 
    resources :photos 
end 

он дает следующие маршруты:

/projects/ 
/projects/:id 
/projects/:project_id/photos 
/projects/:project_id/photos/:id 

Это дает мне проблемы, потому что я должен написать контроллер конкретного before_filter выбора между params[:id] и params[:project_id] для выполнения Project.find(params[:project_id] || param[:id])

Есть ли способ, чтобы изменить маршруты, чтобы иметь :project_id сам для всех маршрутов?

/projects/ 
**/projects/:project_id** 
/projects/:project_id/photos 
/projects/:project_id/photos/:id 
+1

Это не должно быть проблемой, потому что ваши 'Project.find params [: id]' будут находиться в вашем 'ProjectController' и вашем' Proj ect.find params [: project_id] 'будет в вашем' PhotosController'. Если у вас есть что-то действительно уникальное, вы можете использовать http://guides.rubyonrails.org/routing.html#adding-more-restful-actions и 'get: photos, on:: member', который сделает'/projects /: id/photos' и используйте ': id' для всех путей'/projects/'вместо': project_id'. – Chloe

+0

Вы можете попробовать этот трюк: https://stackoverflow.com/a/32664225/2131983 –

ответ

1

Имя идентификатора PARAM ресурса не может быть изменен

Но вы можете переопределить его как не успокоительный путь до ИСКОПАЕМЫЕ

get "projects/:project_id" => "projects#show" 
# etc. for all other 3 methods 
+0

Итак, мне нужно вручную переписать все маршруты, а? Если это единственное решение, я беспокоюсь, что это не будет СУХОЙ. –

2

Другим способ определить метод, что найти текущий проект: project_id, in ApplicationController

def current_project 
    @current_project ||= Project.find params[:project_id] 
end 

И переопределить этот метод в ProjectController

def current_project 
    @current_project ||= Project.find params[:id] 
end 

Затем вы можете использовать current_project в фильтрах для всех контроллеров