事の発端
Rails5.1から使えるform_withを使うと、f.text_fieldなどに今まで自動生成されていたid属性が生成されなくなる。
通常であればid属性が生成されなくても困らないかもしれないけど、f.labelと併用しているときにlabelのfor属性は自動生成されるが、それに対応するinputのid属性が生成されないので少し困った。
解決方法
自分でid属性を指定してもいいが、ちょっと長くて面倒なので自動で生成されるようにできないかを調べてみた。
するとtext_fieldなどにはskip_default_idsオプションがあり、skip_default_ids: falseと指定するとこれまで通りid属性が自動生成されるようになった。
(下記のようにf.label doでネストする方法もあるみたいだけど、今回はデザインの都合上この対応が取れなかったので。
https://github.com/rails/rails/issues/25197#issuecomment-231830219)
ただ、1つ1つに毎回skip_default_idsを指定するのは面倒なので、form_withにオプションで指定できるのではないかと思って調べてみたが、form_with内でskip_default_idsをtrueに指定するのがハードコードされていたのでRails5.1では1つ1つ指定するしかなさそう。。
https://github.com/rails/rails/blob/v5.1.4/actionview/lib/action_view/helpers/form_helper.rb#L745
補足
これはどうやらRails5.2になるとform_with_generates_remote_formsみたいに一括設定できるようになるっぽい。
https://github.com/rails/rails/commit/21cd5b3031b0c022439a88cb750c1e00cd07f1e3