visit
Answer:
How to test if at least one record exists?
Option 1: Using
if Business.exists?(user_id: current_user.id)
# same as Business.where(user_id: current_user.id).exists?
# ...
else
# ...
end
Option 2: Using
(or , the opposite of .present?
)if Business.where(:user_id => current_user.id).present?
# less efficiant than using .exists? (see generated SQL for .exists? vs .present?)
else
# ...
end
Option 3: Variable assignment in the if statement
if business = Business.where(:user_id => current_user.id).first
business.do_some_stuff
else
# do something else
end
Option 3b: Variable assignment
business = Business.where(user_id: current_user.id).first
if business
# ...
else
# ...
end
You can also use
.find_by_user_id(current_user.id)
instead of .where(...).first
.Best option:
Business
object(s): Option 1Business
object(s): Option 3Alternative Answer:
In this case, you can use the
exists?
method provided by ActiveRecord:Business.exists? user_id: current_user.id
Answer:
There is a way to ignore cops on a per-line basis.There is also a way to do it via the configuration file.Run
rubocop --auto-gen-config
and it will generate a file that you can use to disable the offenses.The command also gives a hint on what to do to load those options.On a line per line basis, you can enable and disable the cops as well.# rubocop:disable RuleByName
This is a long line
# rubocop:enable RuleByName
# rubocop:disable BlockComments, AsciiComments
method(argument) # rubocop:disable SomeRule, SomeOtherRule
Alternative Answer:
It’s possible to define regex patterns to automatically ignore certain lines in
rubocop.yml
, so you could choose to ignore all lines starting with a #
character:Metrics/LineLength:
Max: 80
IgnoredPatterns: ['\A#']
This could be improved so that “indented” comment lines (i.e. whitespace followed by a
#
character) is also ignored if that’s what you want.Note that this doesn’t account for lines of code that end with a comment, though:
some_code(that_does_something) # This line would NOT be ignored by Rubocop.
Answer:
You need to use the
/x
modifier, which enables .Like in this case:"bar" =~ /(foo|
bar)/x
Alternative Answer:
Using %r with the x option is the preferred way to do this.See this example from the GitHub ruby style guideregexp = %r{
start # some text
\s # white space char
(group) # first group
(?:alt1|alt2) # some alternation
end
}x
regexp.match? "start groupalt2end"
Answer:
You can disable a bunch of lines like this:# rubocop:disable LineLength
puts "This line is lonnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnng"
# rubocop:enable LineLength
Or add this to your
.rubocop.yml
file to increase the max length:Metrics/LineLength:
Max: 100
Alternative Answer:
Creating a
.rubocop.yml
file (keep an eye on the initial . in the filename) in the root of your project, you’ll have a bunch of options:Metrics/LineLength:
# This will disable the rule completely, regardless what other options you put
Enabled: false
# Change the default 80 chars limit value
Max: 120
# If you want the rule only apply to a specific folder/file
Include:
- 'app/**/*'
# If you want the rule not to apply to a specific folder/file
Exclude:
- 'db/schema.rb'
Answer:
Assignment Branch Condition (ABC) size is a measurement of the size
of a method. It is essentially determined by counting the number of Assignments, Branches, and Conditional statements.
before_action :fetch_current_category, only: [:show,:edit,:update]
before_action :fetch_categories, only: [:show,:edit,:update]
before_action :fetch_search_results, only: [:show,:edit,:update] #or whatever
def show
rate
end
private
def fetch_current_category
@category = Category.friendly.find(params[:id])
end
def fetch_categories
@categories = Category.all
end
def fetch_search_results
@search = category.products.approved.order(updated_at: :desc).ransack(params[:q])
@products = @search.result.page(params[:page]).per(50)
end
Answer:
You can add the following to .rubocop.yml:AllCops:
Exclude:
- 'path/to/excluded/file.rb'
Alternative Answer:
From
rubocop/default.yml
:AllCops:
Exclude:
- 'node_modules/**/*'
- 'vendor/**/*'
Answer:
The simple answer is just adding this to your Rakefile:task test: :rubocop
task :rubocop do
sh 'rubocop'
end
Alternative Answer:
As of version
0.10.0
RuboCop contains a custom rake task that you can use. Just put the following in your Rakefile
.require 'rubocop/rake_task'
RuboCop::RakeTask.new
Answer:
This is the message for the# rubocop:disable Metrics/AbcSize
Alternative Answer:
On your RuboCop configMetrics/AbcSize:
Enabled: false
Answer:
Add the following to your
.rubocop.yml
:Style/FrozenStringLiteralComment:
Enabled: false
Answer:
Pass &:key as an argument to map instead of a block.Meaning:my.objects.map(&:key)
Answer:
First, specify the right path for you ruby env in
Packages/User/SublimeLinter.sublime-settings
as this:{
...
"paths": {
"linux": [],
"osx": [
"~/.rbenv/shims/"
],
"windows": []
},
...
}
In Conclusion
These are the most asked questions about the RuboCop. If you have any suggestions or any confusion, please comment below. If you need any
help, we will be glad to help you.