rails 6.1.3.2以降でActionView::Template::Error: Please use symbols for polymorphic route arguments.
場合の原因と対処について
原因
脆弱性CVE-2021-22885の対応の影響で既存のソースコードでrails 6.1.3.2, 6.0.3.7, 5.2.4.6, 5.2.6にバージョンアップすると既存のコードでActionView::Template::Error: Please use symbols for polymorphic route arguments.
が発生する可能性があります。
脆弱性対応について
CVE-2021-22885のセキュリティーパッチです。
redirect_to
やpolymorphic_url
など動的にURLを生成するヘルパーメソッドで意図しないURLが作成される可能性があり脆弱性になるとの事です。
脆弱性に対するrailsの対応
polymorphic_url
の引数record_or_hash_or_array
にStringのArrayを渡すような実装があると例外ActionView::Template::Error: Please use symbols for polymorphic route arguments.
を発生させる様になりました。
def handle_list(list)
record_list = list.dup
record = record_list.pop
args = []
route = record_list.map do |parent|
case parent
when Symbol
parent.to_s
when String
raise(ArgumentError, "Please use symbols for polymorphic route arguments.")
when Class
args << parent
parent.model_name.singular_route_key
else
args << parent.to_model
parent.to_model.model_name.singular_route_key
end
end
修正PR
影響
polymorphic_url
はform_with
などたくさんのメソッドの内部で使用されているので例えば以下のようなroutingがあった場合に、
namespace :admin do
resources :users
end
#=> /admin/users/
このパスに対してform_with
ヘルパーを使用する場合にmodel
引数の配列に文字列型を指定するとエラーが発生します。
<%= form_with model: ['admin', user] do |f| %>
#=> ActionView::Template::Error: Please use symbols for polymorphic route arguments.
対処方法
上記の例の場合はmodel
引数の配列に指定していた文字列をシンボル変更します。
- <%= form_with model: ['admin', user] do |f| %>
+ <%= form_with model: [:admin, user] do |f| %>