`rich_text_area_tag`でフォーム属性が無視されるバグを修正
lexxy_rich_textarea_tagがform属性をHTMLオプションから削除していた問題を修正しました。これにより、標準の<input form="myform">と同様に、フォームの外部からLexxyエディタを関連付けられるようになります。
背景
HTMLのform属性は、入力要素を<form>タグの外側に配置しながら特定のフォームと関連付けるための標準仕様です。<input form="myform">のように記述することで、DOMの構造上はフォームの外部にある要素もフォーム送信に参加できます。
lexxy_rich_textarea_tagの実装にはもともと options.delete(:form) という行が存在し、渡されたHTMLオプションからform属性を取り出してローカル変数に格納していました。しかし取り出した値は以後どこにも使われておらず、最終的なHTML出力に反映されない状態でした。この変更はActionTextがActionText::TrixEditorを抽出した際のコミットで持ち込まれたものです。
ActionText側でTrixエディタの処理を整理・リファクタリングした際にform属性の取り扱いロジックが変更され、Lexxyにその影響が波及した形です。
技術的な変更
修正内容はlib/lexxy/rich_text_area_tag.rbから1行を削除するだけのシンプルなものです。
変更前:
def lexxy_rich_textarea_tag(name, value = nil, options = {}, &block)
options = options.symbolize_keys
form = options.delete(:form)
value = render_custom_attachments_in(value)
value = "<div>#{value}</div>" if value
変更後:
def lexxy_rich_textarea_tag(name, value = nil, options = {}, &block)
options = options.symbolize_keys
value = render_custom_attachments_in(value)
value = "<div>#{value}</div>" if value
options.delete(:form) の呼び出しを削除することで、:formキーがoptionsハッシュに残ったまま後続の処理に渡ります。これにより、最終的なHTML出力にform属性が含まれるようになります。
設計判断
「使わない値を削除しない」という方針が採用されました。
HTMLオプションのパススルー設計において、タグヘルパーが明示的に利用する属性のみをdeleteで取り出し、残りはそのまま出力要素に委譲するのが一般的なRailsの慣習です。form属性はLexxyのロジックが内部で解釈・処理する必要がない属性であるため、削除せずにHTMLへ素通しするのが正しい動作です。修正は1行削除のみであり、既存の動作への影響は:form属性の扱いに限定されます。
まとめ
1行の削除により、フォームの外部にLexxyエディタを配置するユースケースが標準的なHTML仕様に則って機能するようになりました。タグヘルパーにおける属性のパススルー設計の重要性を改めて示す修正です。