[basecamp/lexxy] ネストされたコントローラでのAttachment描画時のパーシャルパス探索を無効化
背景
Railsのネストされたコントローラ(例: Admin::PostsController)内でLexxyのrich textエディタを使用する際、添付ファイル(attachments)を描画しようとすると、名前空間化されたパーシャルテンプレートを探索してしまい、存在しない場合に例外が発生する問題がありました。
この変更は、Action Textのadapter化アプローチへの移行までの一時的な対処として実装されています。
技術的な変更内容
パーシャルパス探索の制御
render_custom_attachments_in メソッド内で、添付ファイルを描画する直前に prefix_partial_path_with_controller_namespace を false に設定するようになりました。
変更後:
def render_custom_attachments_in(value)
if value.respond_to?(:body)
if html = value.body_before_type_cast.presence
self.prefix_partial_path_with_controller_namespace = false if respond_to?(:prefix_partial_path_with_controller_namespace=)
ActionText::Fragment.wrap(html).replace(ActionText::Attachment.tag_name) do |node|
if node["url"].blank?
attachment = ActionText::Attachment.from_node(node)
# ...
動作の違い
変更前の挙動:
- Admin::PostsController から呼ばれた場合、app/views/admin/posts/_attachment.html.erb を探索
- 見つからない場合に ActionView::MissingTemplate 例外が発生
変更後の挙動:
- コントローラの名前空間に関係なく、app/views/action_text/attachments/_attachable.html.erb など、標準のパーシャルパスのみを探索
- ネストされたコントローラでも安全に動作
実装の注意点
このコードは respond_to? チェックを使用して、prefix_partial_path_with_controller_namespace= メソッドが存在する場合のみ設定を変更します。これにより、古いRailsバージョンや異なるコンテキストでも安全に動作します。
パッケージバージョン
この修正に伴い、npm パッケージのバージョンが 0.1.27-beta から 0.7.0-beta に更新されています。メジャーバージョンの変更は、将来のadapter化アプローチへの移行を見据えたものと考えられます。