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