Вложенная маршрутизация для рельс модели наследования одной таблицы 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?

Другие вопросы по тегам