link_to ヘルパーが _blob.html.erb に「target」属性を表示しない
概要
Active Storage BLOB の部分ビュー (app/views/active_storage/blobs/_blob.html.erb) へのリンクに target=“_blank” 属性を入れたいのですが、この属性は最終的な HTML に表示されません。
#app/views/active_storage/blobs/_blob.html.erb
<%= link_to blob.filename, rails_blob_path(blob), target: "_blank" %>
最終的な HTML では、target=“_blank” は表示されません。
<a href="/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBDZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--48145f82f0b597246f7579fe56b06f563320fe15/file.pdf">file.pdf</a>
実際、テストのために link_to ヘルパーの代わりに HTML タグを配置しましたが、これも機能しません。ただし、別の観点からは機能します。
ID 属性でテストしましたが、どちらも機能しません。
Ruby バージョン: Ruby 3.2.2 (2023-03-30 リビジョン e51014f9c0) [x64-mingw-ucrt]
Rails バージョン: Rails 7.0.6。
OS:Windows11。
ご協力いただき、誠にありがとうございました
解決策
アクション テキストをレンダリングしている場合、HTML はサニタイズされます。 render_action_text_content ヘルパー メソッドは Rails::Html::Sanitizer.safe_list_sanitizer を使用し、デフォルトでターゲット属性を削除します。
何が起こっているかをテストする 1 つの方法は、Rails コンソールに移動してこれを実行することです。
content = ActionText::Content.new('<a target="_blank" href="my_url">my text</a>')
helper.render_action_text_content(content)
=> "<a href=\"my_url\">my text</a>"
target 属性を許可するには、これをイニシャライザに追加して、アプリを再起動します。
ActionText::ContentHelper.allowed_attributes << 'target'
これにより、ターゲットは以下を通過できるようになります。
content = ActionText::Content.new('<a target="_blank" href="my_url">my text</a>')
helper.render_action_text_content(content)
=> "<a target=\"_blank\" href=\"my_url\">my text</a>"
target 属性がデフォルトで削除される理由は、タブナビングを防ぐためであることに注意してください。関連する攻撃の詳細と、target 属性を許可する場合にセキュリティの問題を防ぐために rel 属性で noreferrer を使用する方法については、この投稿を参照してください。