如何从强参数中删除CodeClimate类似的代码?

时间:2014-01-11 19:59:19

标签: ruby-on-rails optimization dry

我正在CodeClimate.com中分析我的代码,我总是在同一行中遇到类似的代码问题:

params.permit(some parameters here)

CodeClimate仅根据代码的质量而不是内容来检测此代码,因此我的质量没有提高。

有没有办法告诉CodeClimate这个代码不重复甚至类似,只要它是参数哈希?

3 个答案:

答案 0 :(得分:1)

为什么不重构这些问题?说,你有代码:

class PostsController < ApplicationController
  # ...

  def resource_params
    params.require(:post).permit(:title, :body)
  end
end

class CommentsController < ApplicationController
  # ...

  def resource_params
    params.require(:comment).permit(:name, :email, :body)
  end
end

您可以将重复代码移动到超类中,只在子类中留下差异:

class ApplicationController < ActionControllerBase
  # ...

  def resource_params
    params.require(resource_name).permit(*permitted_resource_params)
  end
end

class PostsController < ApplicationController
  # ...

  def resource_name
    :post
  end

  def permitted_resource_params
    [:title, :body]
  end
end

class CommentsController < ApplicationController
  # ...

  def resource_name
    :comment
  end

  def permitted_resource_params
    [:name, :email, :body]
  end
end

当然,如果在某些控制器中你有不同的params权限规则 - 你可以在其中重新定义resource_params方法。

答案 1 :(得分:1)

正如MikiDiet建议的那样,最好是做重构。但这个建议并不能完全解决问题。根据我的经验,CodeClimate将报告代码味道:

def resource_name
 :post
end

def permitted_resource_params
  [:title, :body]
end    

作为跨控制器的代码重复。

答案 2 :(得分:0)

没有办法避免这种代码转换问题,只要它不区分方法的名称,只是它的质量。