11
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

rails 6.1.3.2の` ActionView::Template::Error: Please use symbols for polymorphic route arguments.`が発生する理由と対処

Last updated at Posted at 2021-05-06

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_topolymorphic_urlなど動的にURLを生成するヘルパーメソッドで意図しないURLが作成される可能性があり脆弱性になるとの事です。

See: https://weblog.rubyonrails.org/2021/5/5/Rails-versions-6-1-3-2-6-0-3-7-5-2-4-6-and-5-2-6-have-been-released/

脆弱性に対する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

See: https://github.com/rails/rails/blob/c4c21a9f8d7c9c8ca6570bdb82d64e2dc860e62c/actionpack/lib/action_dispatch/routing/polymorphic_routes.rb#L284-L303

修正PR

影響

polymorphic_urlform_withなどたくさんのメソッドの内部で使用されているので例えば以下のようなroutingがあった場合に、

config/routes.rb
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| %>
11
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?