0

Ich habe ein Array von verschiedenen ActiveRecord Objekte, die Objekte verschiedener Modelle sind. Einer von ihnen ist Team genannt, die eine verschachtelte Ressource von Department ist: SoLink zu verschachtelten Ressource in jedem

resources :departments do 
    resources :teams 
end 

, wenn ich diese verwenden im array.each wie folgt aus:

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

Es wirft einen Fehler, dass team_path doesnt existieren, was ist logisch, weil von verschachtelten Ressourcen heißt die Route department_team_path, aber ich kann diese Methode nicht unbedingt nennen, weil ich auch Objets anderer Modelle in dieser each behandle.

Eine Möglichkeit, die ich sehe, ist, eine Route namens team_path hinzuzufügen, die sich auf Team # Show bezieht, aber das ist nicht schön und auch schlecht für die SEO. Gibt es noch eine bessere Möglichkeit, in einem Kurs auf diese und andere Modelle zu verlinken?

Antwort

0

Ich schrieb meine eigenen Methoden, um mit diesem Problem umzugehen. Sie befinden sich im Bereich 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 

So kann ich folgendes tun:

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

Es funktioniert ziemlich gut für mich jetzt, ...

1

versuchen Sie dies: link_to element.name, url_for(element)

+0

Nö diese nicht funktioniert, immer noch den gleichen Fehler – davidb

+0

Versuchen Sie es (sagen Sie mir, wenn es geholfen hat): http://losetechies.com/joshuaflanagan/2012/03/27/a-smarter-rails-url_for-helper/ – ramigg

+0

Es inspiriert mich, aber ich wähle einen anderen Weg, weil alle Informationen sind verfügbar und ich möchte sie nicht wie in der Post eine Sekunde später aufschreiben. – davidb

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 

gemäß Rails Guides. Alternativ können Sie resources :departments, :shallow => true verwenden, aber wie Sie erwähnt, dass unerwünschte Ergebnisse für SEO geben werden.

+0

Natürlich würde das in diesem speziellen Fall funktionieren, aber es wird im Allgemeinen nicht funktionieren. Ich habe jetzt meine eigene Methode geschrieben, ... werde sie bald veröffentlichen – davidb

Verwandte Themen