我有一个各种ActiveRecord对象的数组,它们是不同模型的对象。其中一个名为Team
,它是Department
的嵌套资源:
resources :departments do
resources :teams
end
所以当我在array.each
中使用它时,就像这样:
array.each do |element|
link_to element.name, element
end
它抛出一个team_path
不存在的错误,因为嵌套的ressources路由被称为department_team_path
但是我不能完全调用这个方法,因为我也在处理这个方法中的其他模型的Objets {{1 }}。
我看到的一个可能性是添加一个名为team_path的路由,指的是Team#Show,但这不是很漂亮,也不适合SEO。是否有更好的可能性在一门课程中链接到这个和其他模型?
答案 0 :(得分:2)
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带来不良后果。
答案 1 :(得分:1)
试试这个:
link_to element.name, url_for(element)
答案 2 :(得分: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
现在对我来说非常好,...