2012-04-11 63 views
0

我有一個不同模型的對象的各種ActiveRecord對象的數組。其中之一是所謂的Team這是Department嵌套的ressource:鏈接到每個嵌套的資源

resources :departments do 
    resources :teams 
end 

所以,當我用這個在array.each這樣的:

array.each do |element| 
    link_to element.name, element 
end 

它拋出一個錯誤team_path犯規存在什麼邏輯,因爲嵌套資源的路線稱爲department_team_path,但我無法完全調用此方法,因爲我也在此each中處理其他模型的Objets。

我看到的一個可能性是添加一個稱爲team_path的路線,這指的是Team#Show,但那不是很漂亮,對SEO也不好。在一門課程中有沒有另外一種更好的可能性鏈接到這個和其他模型?

回答

0

我寫了自己的方法來處理這個問題。它們位於ApplicationHeler

def nested_name(object) 
    routes = Rails.application.routes.named_routes.to_a 
    name = nil 
    routes.each do |r| 
     name = r[0].to_s if r[1].requirements[:controller] == object.class.to_s.downcase.pluralize && r[1].requirements[:action] == "show" 
    end 
    name 
    end 

def nested_object(object) 
    name = nested_name(object) 
    parent = name.gsub("_", "").gsub(object.class.to_s.downcase, "") 
    if object.class.reflect_on_association(parent.to_sym) 
    return [object.send(parent), object] 
    else 
    return object 
    end 
end 

因此,我可以做到以下幾點:

array.each do |element| 
    link_to element.name, nested_object(element) 
end 

現在的工作很適合我,...

1

試試這個: link_to element.name, url_for(element)

+0

沒了,這並不工作,還是同樣的錯誤 – davidb 2012-04-11 10:50:50

+0

試試這個(告訴我它是否有幫助):http://lostechies.com/joshuaflanagan/2012/03/27/a-smarter-rails-url_for-helper/ – ramigg 2012-04-11 10:59:27

+0

它啓發了我,但我選擇另一種方式,因爲所有的信息是可用並且我不想像在帖子中那樣在一段時間內寫下它們。 – davidb 2012-04-11 13:55:10

1
array.each do |element| 
    if element.is_a?(Team) 
    link_to element.name, url_for([element.department, element]) 
    else 
    link_to element.name, element 
    end 
end 

Rails Guides。或者,您可以使用resources :departments, :shallow => true,但像您提到的那樣會給SEO帶來不希望的結果。

+0

在這個特定情況下工作的原因,但它不會通常工作。我現在寫了自己的方法,......會很快發佈 – davidb 2012-04-11 13:50:12