1

我在我的模型文件中創建了單表繼承模型,並且在路由時遇到困難。當我使用:在我的資源中,它重命名我的命名路徑。單表繼承模型rails的嵌套路由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) 

然而,使用:如重命名從advertiser_account_campaigns到account_campaigns我命名的道路。我的路線看起來像

account_campaigns GET /advertiser_accounts/:account_id/campaigns(.:format) campaigns#index 

所以,當我創建使用的form_for一個新的項目,我會得到 「未定義的方法`advertiser_account_campaigns_path'」

編輯:當前黑客攻擊的解決方案

A爲中心的方式破解我正在使用的是複製路由文件中的代碼。任何人都有建議?

resources :advertiser_accounts, :as => "accounts" do 
    resources :campaigns 
end 
resources :advertiser_accounts do 
    resources :campaigns 
end 
+0

你可以發佈你的erb /表單代碼嗎?謝謝 – plainjimbo 2012-04-01 00:30:35

+1

其實,這不僅僅是表單代碼。如果使用:as,我無法鏈接到我的嵌套路徑。例如,link_to代碼<%= link_to'顯示所有廣告系列',advertiser_account_campaigns_path(@advertiser_account)%>將返回「未定義的方法'advertiser_account_campaigns_path'」。這是因爲當我使用as =>「accounts」時,advertiser_account_campaigns_path的命名路徑被重命名爲account_campaigns_path。我希望能夠創建一個像127.0.0.1:3000/advertiser_accounts/10/campaigns這樣的有效鏈接,而不會在routes.rb – user1157352 2012-04-01 03:54:50

+0

中重複太多的代碼,從而發現同樣的問題,您是否設法找到解決方案? – pduersteler 2013-02-18 21:34:52

回答

0

如果你運行「耙路線」與您的設置,你會看到:

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」,將「:作爲」實際上改變了通話在代碼中不是url中的路徑。如果你想改變路徑,你應該使用「:path =>」而不是「:as =>」。

Rails guide on routing還顯示了一些帶有「:as」和「:path」的例子以及由此產生的路徑和幫助程序,您需要稍微搜索一下,因爲認爲它們只用於解釋其他情況的示例。

編輯:重新閱讀您的問題,我想您可能也想看看member routes,我不確定這是您的意思,它是一個單一的繼承,而不是想通過advertiser_account的':account_id' ?