前回の続き。
今回は、子(明細)行の追加をする際、内容を複写して表示できるようにします。
今回は特に、明細行単位にコピーボタンが用意できないか考えます。
行追加時に値をコピーすることは、機能として備わっているか?
調べてみましたが、答えはノーかと思います。
正式にサポートされているのであれば、チュートリアル系の記事にあると思いますので。
裏技的なものは、見たことがあるが…
リンクはすべて質問サイトより
上記のサイトでは、明細単位に行コピーボタンを付ける手法が載っているようですが、ただ「無限ループになる」とも書いていますね。
裏技を試してみる
まずは、親側のフォームに(質問サイトの裏技的な)parent_f: f
を追加します。
●親のフォーム
render 'actuation_setup_fields', f: act_setup_builder, parent_f: f
実行するとparent_f: f
の箇所がエラーとなるようです。
もともとサポートされてないからなのでしょうが、なぜこういったものを紹介するのか、理解に苦しみます。
とりあえず、別行を追加します。
●親のフォーム
- @parent_f = f
とりあえず、これで、親のfが子で参照できるようになりそうです。
さらに子のフォームにコピー用のボタンを追加します。
●子のフォーム
- code_to_clone = f.object = link_to_add_association 'clone', @parent_f, :子のモデル名複数形 , wrap_object: Proc.new { |new_code| new_code.フィールド名 = code_to_clone.フィールド名; new_code }"
これで試しましたが、描画段階で無限ループになりますね。
ですので、この手法は、却下かなと。
ここまでのまとめ
link_to_add_association
は親側に置くことを前提にしており、子側に置くことを想定していないのでは?と思います。
今後、cocoonにclone機能が追加されることでもない限り、この手法は避けたほうが良さそうです。
input/textareaのコピーはvalueのコピーなので比較的楽ですが、選択肢のある入力タグや属性は、難易度が高い。ですので、公式でサポートしてくれると、とても助かりますね。
Proc.newの本来の利用方法
親側のフォームでProc.new
を書いておけば、追加時の初期表示などをすることはできます。
●親のフォーム
= link_to_add_association 'add', f, :子のモデル名複数形, wrap_object: Proc.new { |d| d.フィールド名 = 'hoge'; d }
行追加時に、任意のフォールド名に「hoge」が初期表示されると思います。
次回
親側のフォームにて、行コピーを実現するには?を考えてみたいと思います。