質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

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

Q&A

解決済

1回答

1024閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

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

0グッド

0クリップ

投稿2019/02/21 08:12

編集2019/02/26 06:43

###やりたいこと

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

回答1

0

ベストアンサー

accepts_nested_attributes_forを使うといい感じになると思います。

かなり古いですがこちらを参考にしてみてください。
http://blog.livedoor.jp/sasata299/archives/51931176.html

投稿2019/02/21 11:40

Kta-M

総合スコア456

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/02/21 13:06 編集

回答ありがとうございます 今日1日調べていてそのページにも行き着いてつかいかたを調べてました ただ build を呼ぶ際親のモデルが必要みたいなので add のたびに favorites すべて user コントローラに送信して build をよんで追加した user.favorites を返してもらうというのはなんか無駄な気がして remote:true にした favorite/new をよんで 一意のIDをふった新規の favorite/_form だけを返してもらって それをDOMに追加するみたいな感じがスマートなのかなと考えていたんですが 「一意のIDをふった新規の favorite/_form だけを返す」という部分がきれいにかけずに困っています
Kta-M

2019/02/21 20:16

すみません、やりたいことをうまく認識できていませんでした。 サブモデル用のフォームを増減させたいわけですね。 であればgemをつかうのはいかがでしょうか? 使ったことがあるのはこちらですが、しばらく更新が無いようなので、 https://github.com/ryanb/nested_form 更新が続いているこちらのほうが良さそうです。 https://github.com/nathanvda/cocoon
退会済みユーザー

退会済みユーザー

2019/02/22 01:46

>やりたいことをうまく認識できていませんでした 質問した段階では複数の行を区別する方法すらわかっていなかったので その後 accepts_nested_attributes_fo や build にいきついたのですが new したときの実現方法でさらに問題がでた感じでした ジェムを教えていただいてありがとうございます 早速使ってみたいと思います
退会済みユーザー

退会済みユーザー

2019/02/22 06:48

cocoonを使うとすごく楽にやりたいことが実現できました サブモデルはコントローラーもいらなくてモデルと favorite_field っていう _form 的なものを1つかくだけでいいんですね ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問