0

У меня есть массив различных объектов ActiveRecord, которые являются объектами разных моделей. Один из них называется Team, который является вложенным Ressource из Department:Ссылка на вложенный ресурс в каждом

resources :departments do 
    resources :teams 
end 

Так что, когда я использую это в array.each, как это:

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

Он бросает ошибку, team_path оленья кожа существует, Что логично, поскольку из вложенных ресурсов, маршрут называется department_team_path, но я не могу назвать этот метод абсолютно потому, что я также рассматриваю Objets других моделей в этом each.

Одна из возможностей, которую я вижу, - это добавить маршрут, называемый 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

+0

Попробуйте (скажите, помогло ли это): http://lostechies.com/joshuaflanagan/2012/03/27/a-smarter-rails-url_for-helper/ – ramigg

+0

Это вдохновило меня, но я выбираю другой путь, потому что вся информация и я не хочу записывать их в такое время, как в сообщении. – 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 

согласно Rails Guides. В качестве альтернативы вы можете использовать resources :departments, :shallow => true, но, как вы упомянули, это даст нежелательные результаты для SEO.

+0

Причина, которая будет работать в этом конкретном случае, но она не будет работать генетически. Я написал свой собственный метод сейчас ... скоро опубликует – davidb

Смежные вопросы