动态url_for具有不同的嵌套量

时间:2016-01-28 13:49:43

标签: ruby-on-rails

我正在构建一个帮助方法,它允许我传递一个数组,其中包含我希望可用于管理对象的选项(如编辑,删除等)。该方法的简化版本如下所示:

  def management_links(instance, actions, *parent)
    actions.each do |action|
      if (can? action, instance)
        has_options = true
        case action
          when :destroy
            options = {content: glyphicon('trash') + " Delete #{instance.class.to_s}", class: "delete #{instance.class.to_s.downcase}", method: :delete}
            url = url_for [parent, instance]
        end
      end
    end
  end

正如您所看到的,这适用于嵌套一次的对象(传递1个父模型)以获取结构:

parent_model / PARENT_ID /模型/ ID /动作

但是现在我有一个嵌套两次的模型,所以这不再削减它了。我尝试传递一个数组[@grandparent,@ parent],但由于url_for已经有一个数组,所以没有用。

有没有办法让我通过无限制的'父对象使用url_for?

1 个答案:

答案 0 :(得分:1)

*parent将始终是数组的一部分(如果存在),那么为什么不将它声明为然后将实例推入其中:

def management_links(instance, actions, *parent)
    parents = Array(parent) if parent
    new_url = parents ? parents << instance : instance

    actions.each do |action|
      if (can? action, instance)
        has_options = true
        case action
          when :destroy
            options = {content: glyphicon('trash') + " Delete #{instance.class.to_s}", class: "delete #{instance.class.to_s.downcase}", method: :delete}
            url = url_for new_url
        end
      end
    end
end

我使用Array()来确保parent是正确的数据类型(您可以传递var的单个实例)。

偏离主题,但在追求convention时,您应该阅读nesting by more than one layer

  

资源不应该嵌套超过1级。