Skip to content

Commit d85608a

Browse files
committed
add snippet rails/convert_to_params_expect
1 parent 6d959fb commit d85608a

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed

lib/rails/convert_to_params_expect.rb

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# frozen_string_literal: true
2+
3+
Synvert::Rewriter.new 'rails', 'convert_to_params_expect' do
4+
configure(parser: Synvert::PRISM_PARSER)
5+
6+
description <<~EOS
7+
It converts `params.require(...).permit(...)` to `params.expect(...)`.
8+
9+
```ruby
10+
params.require(:post).permit(:title, :summary, categories: [:name])
11+
```
12+
13+
=>
14+
15+
```ruby
16+
params.expect(post: [:title, :summary, categories: [[:name]]])
17+
```
18+
EOS
19+
20+
if_gem 'actionpack', '>= 8.0'
21+
22+
within_files Synvert::RAILS_CONTROLLER_FILES do
23+
with_node node_type: 'call_node',
24+
receiver: { node_type: 'call_node', receiver: 'params', name: 'require' },
25+
name: 'permit' do
26+
goto_node :arguments do
27+
with_node node_type: 'array_node' do
28+
wrap prefix: '[', suffix: ']'
29+
end
30+
end
31+
end
32+
end
33+
34+
within_files Synvert::RAILS_CONTROLLER_FILES do
35+
with_node node_type: 'call_node',
36+
receiver: { node_type: 'call_node', receiver: 'params', name: 'require' },
37+
name: 'permit' do
38+
replace_with 'params.expect({{receiver.arguments.arguments.first.value.to_s}}: [{{arguments}}])'
39+
end
40+
end
41+
end
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
5+
RSpec.describe 'Convert to params.expect' do
6+
let(:rewriter_name) { 'rails/convert_to_params_expect' }
7+
let(:fake_file_path) { 'app/controllers/posts_controller.rb' }
8+
let(:test_content) { <<~EOS }
9+
class PostsController < ApplicationController
10+
def post_params
11+
params.require(:post).permit(:title, :summary)
12+
end
13+
14+
def post_params
15+
params.require(:post).permit(:title, :summary, categories: [:name])
16+
end
17+
end
18+
EOS
19+
let(:test_rewritten_content) { <<~EOS }
20+
class PostsController < ApplicationController
21+
def post_params
22+
params.expect(post: [:title, :summary])
23+
end
24+
25+
def post_params
26+
params.expect(post: [:title, :summary, categories: [[:name]]])
27+
end
28+
end
29+
EOS
30+
31+
include_examples 'convertable'
32+
end

0 commit comments

Comments
 (0)