使用Rubocop的长强大的绳索打破

时间:2015-06-17 18:38:03

标签: ruby-on-rails ruby

有以下代码行:

  def tree_service_params
    params.permit(:id, { tree_service_categories_attributes: [:id, :title, :enabled, :_destroy, { tree_service_category_items_attributes: [:id, :image, :title, :description, :cost, :enabled] }] })
  end

这是简单的Rails强大的参数。我需要打破这条线,因为它太长了。我使用Rubocop来满足Ruby指南。我该怎么办?提前致谢!

3 个答案:

答案 0 :(得分:1)

这可能取决于您在Rubocop中启用的其他规则。但它看起来很简单,只需缩短线条。这是一个简单的方法:

def categories_attrs
  { tree_service_categories_attributes: [:id, :title, :enabled, :_destroy, items_attrs] }
end

def items_attrs
  { tree_service_category_items_attributes: [:id, :image, :title, :description, :cost, :enabled] }
end

def tree_service_params
  params.permit(:id, categories_attrs)
end

你也可以多线,像这样:

def tree_service_params
  params.permit(:id, { 
    tree_service_categories_attributes: [
      :id, :title, :enabled, :_destroy, {
        tree_service_category_items_attributes: [
          :id, :image, :title, :description, :cost, :enabled
        ] 
      }
    ]
  })
end

答案 1 :(得分:0)

一种方法是:您可以在多行上断开代码以使其更具可读性。但是,因为你允许很多属性,这意味着你的控制器中会有很多代码,这本身就是一件坏事。控制器应始终是瘦的。

params.permit(:id, { 
  tree_service_categories_attributes: [ 
    :id, :title, :enabled, :_destroy, {
      tree_service_category_items_attributes: [
        :id, :image, :title, :description, :cost, :enabled
      ] 
    }
  ]
})

答案 2 :(得分:0)

如果U必须处理授权,则首选解决方案(针对不同属性组具有不同方法),因为U将能够在第一个方法中独立地授权每个方法,而不是在第二个方法中。

def categories_attrs

// if authorized return params object , if not return null.

  { tree_service_categories_attributes: [:id, :title, :enabled, :_destroy, items_attrs] }

end