質問するログイン新規登録

Q&A

解決済

1回答

1333閲覧

[Rails] index 画面で直接編集を行いたい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2019/02/21 08:12

編集2019/02/26 06:43

0

0

###やりたいこと

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 は数行かくだけですんなり動けばすばらしいんですが
ブラックボックスなところが多すぎて
少しでもちがうことをやろうとすると途端に動かなくなり解決方法もまったくわからないので
後々柔軟な変更がきくように自分でフォームを生成するようにしました…

せっかく教えてもらったんですが自分には使いこなせなかったです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

guest

この質問の投稿者はすでに退会しているため、質問者からの返信がない点にご留意ください。

回答の取得に失敗しました

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.25%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問