inuinu blog(開発用)

BOT @wagagun の開発ノウハウや、IT向け?の雑記ブログです。

【Ruby on Rails7】cocoonを導入(その8:行コピーしたい(失敗編))

この記事では、Ruby on Rails7のgemパッケージcocoonについて、導入・カスタマイズ行います。
今回は行追加時に、値をコピーする手法を考えます。
(本記事は失敗編です。)

前回の続き。

inuinu-tech.hatenablog.jp

今回は、子(明細)行の追加をする際、内容を複写して表示できるようにします。
今回は特に、明細行単位にコピーボタンが用意できないか考えます。

今回はcocoonの機能外の実装になります。
正式サポートされない実装は、避けたほうが良いかと思います。

行追加時に値をコピーすることは、機能として備わっているか?

調べてみましたが、答えはノーかと思います。
正式にサポートされているのであれば、チュートリアル系の記事にあると思いますので。

裏技的なものは、見たことがあるが…

リンクはすべて質問サイトより

stackoverflow.com

stackoverflow.com

stackoverflow.com

上記のサイトでは、明細単位に行コピーボタンを付ける手法が載っているようですが、ただ「無限ループになる」とも書いていますね。

裏技を試してみる

まずは、親側のフォームに(質問サイトの裏技的な)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」が初期表示されると思います。

次回

親側のフォームにて、行コピーを実現するには?を考えてみたいと思います。

inuinu-tech.hatenablog.jp