引入模块时如何处理RuboCop::Cop::Rails::LexicallyScopedActionFilter问题?
解决Rubocop Rails提示“create未在类中显式定义”的问题
我有如下Rails控制器代码:
class UsersController < ApplicationController before_action :user_authentication, except: :create include Crud end
create动作实际定义在引入的Crud模块中,但Rubocop Rails提示“create未在类中显式定义”,可以用以下几种方法解决:
方法一:在控制器中显式声明模块动作
让Rubocop明确感知到create动作的存在,有两种写法:
- 使用
delegate声明:
class UsersController < ApplicationController before_action :user_authentication, except: :create include Crud delegate :create, to: :self end
- 用
public关键字重新声明(前提是Crud模块中的create是public方法):
class UsersController < ApplicationController before_action :user_authentication, except: :create include Crud public :create end
方法二:配置Rubocop忽略特定场景
全局配置(修改.rubocop.yml)
针对Rails/LexicallyScopedActionFilter规则添加例外:
Rails/LexicallyScopedActionFilter: Exclude: - 'app/controllers/users_controller.rb'
如果有多个控制器都引入Crud模块,也可以用通配符匹配:
Rails/LexicallyScopedActionFilter: Exclude: - 'app/controllers/*_controller.rb'
局部代码注释忽略
只在当前控制器的这个before_action处跳过检查:
class UsersController < ApplicationController # rubocop:disable Rails/LexicallyScopedActionFilter before_action :user_authentication, except: :create # rubocop:enable Rails/LexicallyScopedActionFilter include Crud end
方法三(可选):维护Crud模块时添加显式标记
如果Crud模块是你自己开发的,可以在模块里定义一个动作列表常量,但Rubocop默认不会识别这种自定义标记,所以不如前两种方法直接有效。
内容的提问来源于stack exchange,提问作者Chiara Ani
相关产品推荐
相关产品推荐

