Вложенная маршрутизация для рельс модели наследования одной таблицы 3.1
Я создал модель наследования одной таблицы в моем файле модели, и у меня возникли проблемы с маршрутизацией. Когда я использую: как в моем ресурсе, он переименовывает мой именованный путь.
Файл модели:
class Account < ActiveRecord::Base
belongs_to :user
end
class AdvertiserAccount < Account
end
class PublisherAccount < Account
end
routes.rb
resources :advertiser_accounts, :as => "accounts" do
resources :campaigns
end
Я использовал: как в моих маршрутах, потому что это наследование одной таблицы, и я хочу передать account_id, а не advertiser_account_id. Моя ссылка http://127.0.0.1:3000/advertiser_accounts/1/campaigns
/advertiser_accounts/:account_id/campaigns/:id(.:format)
Тем не менее, используя:as переименовывает мой именованный путь из advertiser_account_campaigns в account_campaigns. Мой маршрут выглядит так
account_campaigns GET /advertiser_accounts/:account_id/campaigns(.:format) campaigns#index
Поэтому, когда я создаю новый элемент с помощью form_for, я получаю "неопределенный метод" advertiser_account_campaigns_path'"
Отредактировано: текущее взломанное решение
Способ, которым я пользуюсь, заключается в дублировании кода в файле маршрутов. У кого-нибудь есть предложения?
resources :advertiser_accounts, :as => "accounts" do
resources :campaigns
end
resources :advertiser_accounts do
resources :campaigns
end
1 ответ
Если вы запустите "Rake Routes" с вашей настройкой, вы увидите это:
account_campaigns GET /advertiser_accounts/:account_id/campaigns(.:format) campaigns#index
POST /advertiser_accounts/:account_id/campaigns(.:format) campaigns#create
new_account_campaign GET /advertiser_accounts/:account_id/campaigns/new(.:format) campaigns#new
edit_account_campaign GET /advertiser_accounts/:account_id/campaigns/:id/edit(.:format) campaigns#edit
account_campaign GET /advertiser_accounts/:account_id/campaigns/:id(.:format) campaigns#show
PUT /advertiser_accounts/:account_id/campaigns/:id(.:format) campaigns#update
DELETE /advertiser_accounts/:account_id/campaigns/:id(.:format) campaigns#destroy
accounts GET /advertiser_accounts(.:format) advertiser_accounts#index
POST /advertiser_accounts(.:format) advertiser_accounts#create
new_account GET /advertiser_accounts/new(.:format) advertiser_accounts#new
edit_account GET /advertiser_accounts/:id/edit(.:format) advertiser_accounts#edit
account GET /advertiser_accounts/:id(.:format) advertiser_accounts#show
PUT /advertiser_accounts/:id(.:format) advertiser_accounts#update
DELETE /advertiser_accounts/:id(.:format) advertiser_accounts#destroy
Таким образом, вы должны использовать "account_campaingns_path" в этой настройке, ": as" фактически изменяет вызовы в коде, а не пути в URL. Если вы хотите изменить пути, вы должны использовать ":path =>" вместо ":as =>".
Руководство Rails по маршрутизации также показывает некоторые примеры с ": as" и ": path" и полученными путями и помощниками, вам нужно немного поискать, потому что вы думаете, что они используются только в примерах, объясняющих другие случаи.
Изменить: перечитывая ваш вопрос, я думаю, что вы также можете посмотреть на маршруты участников, я не уверен, что вы хотите иметь в виду, что это единственное наследование и не хотите передавать ': account_id' в advertiser_account?