2012-04-11 66 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