その入力フォームにreadonly属性は本当に必要ですか?

railsで開発しているとテストツールにcapybara使っていると思う。

まれに、ユーザの入力を制限するために、javascoprtで作ったUIコンポーネント経由で値を設定し、テキストフィールド自体はreadonly属性が有効、というフォームを作ることがある。
とりあえず言われた通りreadonly属性を有効にするのだけど、インテグレーションspecでfill_inメソッドを使って値の設定ができなくなる。

Attempt to set readonly element with value:

こうなってしまうと、javascript実行可能なブラウザドライバーを使ってjavascript経由で値を設定するうことになる。
一応これで丸く収まったように見えるけどjavascript対応ドライバはspecの実行に時間がかかるので、本当に必要な場面以外は避けたい。

readonlyを回避する方法3つ

  • テキストフィールドをやめてinput[type=hidden] に値を設定しプレーンテキストで現在設定中の値を表示する。
  • productionコードにtest実行時限定で値を設定したり, view でreadonlyプロパティをやめるような分岐を入れる
  • テスト実行時にvalidation をremoveするようなメタプログラミングする

テスト実行時だけ、みたいなコードを書いてしまうと、テスト環境では再現しないバグが起きがちなので微妙。

ブラウザの開発者ツールを使えばいくらでもおかしい値を送信できるので、仕様を考えている人にきっちりしすぎるのやめませんかみたいな説得することもありなんじゃないかと思う。いやだめかも。