###やりたいこと
users モデルが hasmany で持つサブモデル favorites を user の edit 画面でまとめて編集したいです
<h1>user edit</h1> name: [...] mail: [...] favorites : [new button] [baseball][delete] [travelling][delete] :
([xyz] は入力フォーム)
のようなイメージです
###試したこと
scaffold で user, favorite 一式作成し
まず favorites/index を user/_form に埋め込み
<%= render template: 'favorites/index' %>
favorites/index.html.erb に edit へのリンクではなく favorites/_form を直接うめこみローカル変数でインスタンスを渡す
<table> : <tbody> <% @users.favorites.each do |fav| %> <%= render 'form', favorite: fav %> <% end %> </tbody> </table>
index から form をレンダリングしたときは @favorite が存在しないのでローカル変数にする
favorites/_form.html.erb
<% favorite = @favorite if !(defined? favorite) %> <%= fields_for(favorite) do |f| %> <%= f.text_field :name %> 以下 f.xxx のフォームを生成
とかきかえて CSS で favorites/_form 内を横並びにすると
見た目はそれっぽくなったんですが id や name が重複してしまい
サブミットしたデータが区別できません
fields_for の中のidを favorite_name や favorite[name] ではなく
favorite_<id>_name とか favorite[id][name] のように区別するにはどうすればいいのでしょうか
form_for や field_for の生成する部品のラベルに
さらに id ごとの配列みたいなのを付与するきれいな方法はないでしょうか
scaffold で生成された fields_for や f.text_field をあきらめて
text_field_tag "favorite[#{favorite.id}][name]", value: favorite.name, id: "favorite_#{favorite.id}_name"
のように無理やりかくしかないでしょうか
追記
fields_for のオプションに child_index っていうのをみつけたので
favorite_form 内に無理やり favorite 自身だけをもった親のモデルをつくって
無理やり2重 field を指定すればほしい HTML ははけたんですが非常にもやもやします
親モデルを無理やりつくったり2重の field_for を作らなくても
内側の fields_for に親の prefix のようなものを自由につけられないのでしょうか
<% user = User.new user.favorites = [favorite] %> <%= fields_for user do |f| %> <%= f.fields_for :favorites, child_index: favorite.id do |f| %> : <% end %> <% end %>
追記:
cocoon は数行かくだけですんなり動けばすばらしいんですが
ブラックボックスなところが多すぎて
少しでもちがうことをやろうとすると途端に動かなくなり解決方法もまったくわからないので
後々柔軟な変更がきくように自分でフォームを生成するようにしました…
せっかく教えてもらったんですが自分には使いこなせなかったです
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/02/21 13:06 編集
2019/02/21 20:16
退会済みユーザー
2019/02/22 01:46
退会済みユーザー
2019/02/22 06:48