2012-06-06 15 views
3

我正在使用Ruby on Rails 3.2.2,並且想爲嵌套資源生成適當的url_for URL。也就是說,我有:如何生成適當的`url_for`嵌套資源?

# config/routes.rb 
resources :articles do 
    resources :user_associations 
end 

# app/models/article.rb 
class Article < ActiveRecord::Base 
    ... 
end 

# app/models/articles/user_association.rb 
class Articles::UserAssociation < ActiveRecord::Base 
    ... 
end 

:生成命名路由就像article_user_associationsarticle_user_associationedit_article_user_association,...

當我認爲我使用:

url_for([@article, @article_association]) 

然後我收到以下錯誤:

NoMethodError 
undefined method `article_articles_user_association_path' for #<#<Class:0x000...> 

不過,如果我說出路由器這樣

# config/routes.rb 
resources :articles do 
    resources :user_associations, :as => :articles_user_associations 
end 

url_for方法按預期工作,它產生,例如,URL /articles/1/user_associations/1

:在這種情況下,生成命名路由就像article_articles_user_associationsarticle_articles_user_associationedit_article_articles_user_association,...

不過,我想是不是「好」的路由器方式建造/在命名後者/工作案例。因此,是否有可能以某種方式使url_for方法生成命名路線,如article_user_association(而不是像article_articles_user_association)?


我讀到有關ActionDispatch::Routing::UrlFor方法Official Documentation(特別是「URL生成名爲路徑」一節),但我不能找到一個解決方案。也許有一種方法可以「說」到Rails的,喜歡它讓當你想用self.primary_key語句更改表的主鍵列使用特定的命名路由器...

# app/models/articles/user_association.rb 
class Articles::UserAssociation < ActiveRecord::Base 
    # self.primary_key = 'a_column_name' 
    self.named_router = 'user_association' 

    ... 
end 
+0

我想知道是否有與「關聯」的命名衝突莫名其妙...它似乎打了一個在某處看到「model_associations」的記憶。 – DGM

+0

@DGM - 我不知道,但我認爲這是一個很常見的問題,很多人都會摔倒。 – Backo

+0

不行,我錯過了命名空間的事情。 – DGM

回答

2

UserAssociation模型是在Articles命名空間,它被包含在已命名的路線:

# app/models/articles/user_association.rb 
class Articles::UserAssociation < ActiveRecord::Base 
    ... 
end 

#  route =>   articles_user_association 
# nested route => article_articles_user_association 

如果您刪除的命名空間,你會得到路由幫助你正在尋找:

# app/models/articles/user_association.rb 
class UserAssociation < ActiveRecord::Base 
    ... 
end 

#  route =>   user_association 
# nested route => article_user_association 

除非你有一個很好的理由讓UserAssociation保持在命名空間中,否則不要。

+0

我知道,如果我刪除名稱空間,我會得到我期待的路由幫助程序,但原因是我有很多模型,爲了讓它們保持簡單的「時尚」,我找到/存儲他們在app/models'目錄下的子目錄中,所以我必須命名空間。 – Backo