【问题标题】:Nested Routing for Single Table Inheritance model rails 3.1单表继承模型 rails 3.1 的嵌套路由
【发布时间】:2012-04-01 00:03:05
【问题描述】:

我在我的模型文件中创建了一个单表继承模型,并且在路由方面遇到了困难。当我在资源中使用 :as 时,它会重命名我的命名路径。

模型文件:

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

我在路由中使用了 :as,因为它是单表继承,我想传递 account_id 而不是advertisingr_account_id。我的链接是http://127.0.0.1:3000/advertiser_accounts/1/campaigns

/advertiser_accounts/:account_id/campaigns/:id(.:format)

但是,使用 :as 将我的命名路径从 ads_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

【问题讨论】:

  • 您也可以发布您的 erb/form 代码吗?谢谢
  • 其实这不仅仅针对表单代码。如果我使用 :as,我无法链接到我的嵌套路径。例如,link_to code 将返回“undefined method `advertiser_account_campaigns_path'”。这是因为当我使用 :as=> "accounts" 时,advertisingr_account_campaigns_path 的命名路径被重命名为 account_campaigns_path。我希望能够创建像 127.0.0.1:3000/advertiser_accounts/10/campaigns 这样的有效链接,而无需在 routes.rb 中复制太多代码
  • 遇到了同样的问题,你找到解决办法了吗?

标签: ruby-on-rails-3 routes parameter-passing single-table-inheritance named-routing


【解决方案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 guide on routing 还显示了一些带有 ":as" 和 ":path" 的示例以及生成的路径和助手,您需要进行一些搜索,因为认为它们仅用于解释其他情况的示例。

编辑:重读你的问题,我想你可能还想看看member routes,我不确定这是否是你想要的意思,它是一个单一的继承,不想传递advertisingr_account的':account_id '?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多