【问题标题】:link to nested ressource in each链接到每个嵌套资源
【发布时间】:2012-04-11 10:32:23
【问题描述】:

我有一个由各种 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 但我不能绝对调用这个方法,因为我也在这个each 中处理其他模型的对象。

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

【问题讨论】:

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


    【解决方案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 带来不良结果。

    【讨论】:

    • 当然,在这种特定情况下会起作用,但通常不会起作用。我现在写了我自己的方法,...很快就会发布它
    【解决方案2】:

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

    【讨论】:

    • 试试这个(告诉我是否有帮助):lostechies.com/joshuaflanagan/2012/03/27/…
    • 它启发了我,但我选择了另一种方式,因为所有信息都是可用的,我不想像在帖子中那样第二次写下来。
    【解决方案3】:

    我编写了自己的方法来处理这个问题。它们位于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
    

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

    【讨论】:

      猜你喜欢
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      相关资源
      最近更新 更多