2015-09-10 3 views
0

Я добавляю ActiveAdmin к зрелым приложениям и с трудом получаю, чтобы генерация маршрута работала для отношения belongs_to. Вот класс отношений:Как получить vanity_url в ActiveAdmin принадлежит_to?

class Project < ActiveRecord::Base 
    def to_param 
    vanity_url.blank? ? id.to_s : vanity_url 
    end 
end 

class Job < ActiveRecord::Base 
    belongs_to :project 
end 

Это важно, потому что мы используем маршруты, такие как domain/projects/awesome_project вместо domain/projects/215. Все довольно стандартное.

В ActiveRecord, я получил соотношение правильно определяется:

ActiveAdmin.register Project do 
end 

ActiveAdmin.register Job do 
    belongs_to :project 
end 

Я считаю, что это правильно, так как маршрут генерируется включают:

admin_project_jobs  GET  /admin/projects/:project_id/jobs(.:format)          admin/jobs#index 
         POST  /admin/projects/:project_id/jobs(.:format)          admin/jobs#create 
new_admin_project_job GET  /admin/projects/:project_id/jobs/new(.:format)         admin/jobs#new 
edit_admin_project_job GET  /admin/projects/:project_id/jobs/:id/edit(.:format)        admin/jobs#edit 
admin_project_job  GET  /admin/projects/:project_id/jobs/:id(.:format)         admin/jobs#show 
... etc 

Когда я использую генератор маршрута, например как admin_project_jobs_path(@project), создается правильный маршрут; это: /admin/projects/awesome_project/jobs.

Проблема в том, что с контроллером ActiveAdmin Jobs значение «awesome_project» не приводит к правильному родительскому объекту. Если я изменю генерацию маршрута на admin_project_jobs_path(@project.id), чтобы использовать идентификатор объекта вместо его vanity_url, это приведет к пути, как /admin/projects/215/jobs, который правильно разрешен. Однако ActiveAdmin генерирует другие пути и те используют этот объект, который разрешает вернуться к vanity_url, поэтому я не могу навсегда решить эту проблему.

Я прочитал код, чтобы узнать, где сгенерирован путь, но похоже, что реальное решение должно быть в объекте Project или Object ActiveAdmin. Я пробовал поставить пользовательские блоки find_resource в оба, но не нашел того, что делает то, что нужно.

Кто-нибудь работал с таким сценарием или понимает больше о том, как разрешены ресурсы ActiveAdmin? Благодарю.

ответ

1
ActiveAdmin.register Job do 
    belongs_to :project, :finder => :find_by_title! # or what can find your model 
end 

Для получения дополнительной информации см https://github.com/josevalim/inherited_resources#belongs-to

+0

Спасибо, Тим, это было очень полезно. Мне также пришлось удалить пользовательские «find_resource» и «def index», которые я сделал при попытке других путей, а также обновить все помощники путей, чтобы сделать рендеринг индекса и показа страниц. –