class RuboCop::Cop::Rails::LexicallyScopedActionFilter
end
end
@content = Article.find(params)
def load_article
private
end
super
def update
# in the superclass, so needs to invoke ‘super`
# the cop requires this method, but it relies on behaviour defined
before_action :load_article, only: [:update]
class ArticlesController < ContentController
end
end
@content.update(content_attributes)
def update
class ContentController < ApplicationController
@example
end
end
# something
def foo
end
before_action proc { authenticate }, only: :foo
included do
extend ActiveSupport::Concern
module FooMixin
# good
end
end
before_action proc { authenticate }, only: :foo
included do
extend ActiveSupport::Concern
module FooMixin
# bad
@example
end
end
def logout
end
def settings
end
def index
before_action :require_login, only: %i[index settings logout]
class LoginController < ApplicationController
# good
end
end
def index
before_action :require_login, only: %i[index settings logout]
class LoginController < ApplicationController
# bad
@example
remember to invoke `super` in the subclass actions.
If you rely on behaviour defined in the superclass actions, you must
define the filter in that class or module.
methods that are defined in other classes or modules, you should
mixins on the filter, but these can confuse developers. If you specify
You can technically specify methods of superclass or methods added by
`except` options are defined within the same class or module.
This cop checks that methods specified in the filter’s ‘only` or
def array_values(node) # rubocop:disable Metrics/MethodLength
-
(Array
-)
Parameters:
-
node
(RuboCop::AST::Node
) --
def array_values(node) # rubocop:disable Metrics/MethodLength case node.type when :str [node.str_content.to_sym] when :sym [node.value] when :array node.values.map do |v| case v.type when :str v.str_content.to_sym when :sym v.value end end.compact else [] end end
def message(methods, parent)
-
(String)
-
Parameters:
-
parent
(RuboCop::AST::Node
) -- -
methods
(Array
) --
def message(methods, parent) if methods.size == 1 format(MSG, action: "`#{methods[0]}` is", type: parent.type) else format(MSG, action: "`#{methods.join('`, `')}` are", type: parent.type) end end
def on_send(node)
def on_send(node) methods_node = only_or_except_filter_methods(node) return unless methods_node parent = node.each_ancestor(:class, :module).first return unless parent block = parent.each_child_node(:begin).first return unless block defined_methods = block.each_child_node(:def).map(&:method_name) methods = array_values(methods_node).reject do |method| defined_methods.include?(method) end message = message(methods, parent) add_offense(node, message: message) unless methods.empty? end