In Rails, config.load_defaults
loads default configuration values for a target version and all versions prior. For example, config.load_defaults
6.0 will load defaults for all versions up to and including version 6.0. So every time we upgrade rails version, we need to change config.load_defaults
to the new version.
Let’s use synvert to set the config.load_defaults
. For example, we want to set config.load_defaults
to 6.0, we can write the following snippet:
within_file 'config/application.rb' do
with_node node_type: 'class', name: 'Application' do
exists = false
with_node node_type: 'send', receiver: 'config', message: 'load_defaults', arguments: { size: 1 } do
exists = true
replace_with "config.load_defaults 6.0"
end
unless exists
prepend "config.load_defaults 6.0"
end
end
end
First, the snippet searches for the file config/application.rb
. Once found, it looks for class Application
within that file. After locating the class, it searches for the code containing config.load_defaults
and replaces it with config.load_defaults 6.0
if it exists. In cases where config.load_defaults
is not found, it adds config.load_defaults 6.0
at the beginning of the class.
While it works, it becomes cumbersome when we need to upgrade rails to version 6.1 and 7.0. In such cases, we would have to manually copy and paste the snippet and modify 6.0 to 6.1 and 7.0.
To overcome this duplication issue, we introduced the concept of Helper. By doing so, we can extract the above snippet into a reusable Helper:
Synvert::Helper.new 'rails/set_load_defaults' do |options|
rails_version = options[:rails_version]
within_file 'config/application.rb' do
with_node node_type: 'class', name: 'Application' do
exists = false
with_node node_type: 'send', receiver: 'config', message: 'load_defaults', arguments: { size: 1 } do
exists = true
replace_with "config.load_defaults #{rails_version}"
end
unless exists
prepend "config.load_defaults #{rails_version}"
end
end
end
end
This snippet defines a Helper called rails/set_load_defaults
. This Helper takes an option called rails_version
as input.
To utilize this Helper, we can use the call_helper
API to execute the Helper and provide rails_version
option as a parameter:
Synvert::Rewriter.new 'rails', 'upgrade_5_2_to_6_0' do
call_helper 'rails/set_load_defaults', rails_version: '6.0'
end
It sets config.load_defaults
to 6.0.
Synvert::Rewriter.new 'rails', 'upgrade_6_0_to_6_1' do
call_helper 'rails/set_load_defaults', rails_version: '6.1'
end
It sets config.load_defaults
to 6.1.
Helpers are extremely beneficial as they enable us to extract commonly used code from different snippets. This means that instead of repeating the same code across different snippets, we can place it in a Helper and reuse it wherever needed. This approach enhances code reusability and helps in keeping the codebase concise and organized.
Share this post