link_to每个中的嵌套资源

时间:2012-04-11 10:32:24

标签: ruby-on-rails ruby-on-rails-3.1 routes nested-resources

我有一个各种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。是否有更好的可能性在一门课程中链接到这个和其他模型?

3 个答案:

答案 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

现在对我来说非常好,...