0

我有一个由各种 ActiveRecord 对象组成的数组,它们是不同模型的对象。其中一个被称为Team嵌套资源Department

resources :departments do
  resources :teams
end

所以当我array.each像这样使用它时:

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

它会抛出一个错误,team_path由于嵌套的资源调用了路由,所以它不存在什么逻辑,department_team_path但我不能绝对调用此方法,因为我也在 this 中处理其他模型的 Objets each

我看到的一种可能性是添加一个名为 team_path 的路由,它指的是 Team#Show,但这并不漂亮,而且对 SEO 也不利。在一个课程中链接到这个模型和其他模型是否还有另一种更好的可能性?

4

3 回答 3

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 指南。或者,您可以使用resources :departments, :shallow => true但就像您提到的那样会给 SEO 带来不良结果。

于 2012-04-11T13:44:00.160 回答
1

试试这个: link_to element.name, url_for(element)

于 2012-04-11T10:47:28.710 回答
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

现在对我来说效果很好,...

于 2012-04-11T13:52:18.030 回答