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

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

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

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

3049閲覧

accepts_nested_attributes_forとfields_forを使ってhas_many関連の子レコードを作成/更新

innjera

総合スコア132

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2017/04/12 11:35

編集2017/04/12 11:51

Lesson(model)LessonImage(model、画像です)との間に以下の関連付けを持っています。
LessonImageは画像で、Carrierwaveを利用し、新規にLessonを作成する際に、accepts_nested_attributes_forfields_forを使って同時に子レコードであるLessonImageも作成しています。

問題は、Lessonが所有するLessonImageの写真を0-3枚としているのですが、以下の通り、new(create)の際に写真を3枚uploadしないと、その後に当該lessonをedit(update)する際に、new(create)の際にuploadした写真の数しか編集ができないことです。

実現したいことは、new(create)の際に写真を例えば1枚だけuploadし、その後にedit(update)する際に2枚追加できるようにしたい(つまり、デフォルトで常に3つファイルを選択ボタンが並んでいる様にしたい)のですが、やり方がわからずご教示頂けますと幸甚です。

ruby

1関連付け 2#Lesson Model 3has_many :lesson_images, dependent: :destroy 4accepts_nested_attributes_for :lesson_images, allow_destroy: true 5 6#LessonImage Model 7 belongs_to :lesson, optional: true(#Rails 5.0.0.1を利用)

ruby

1#lessons_controller.rb 2def new 3 @lesson = Lesson.new(posted_at: Time.current) 4 3.times{@lesson.lesson_images.build} 5 end 6 7 def edit 8 @lesson = current_user.adviser.lessons.find(params[:id]) 9 end 10 11 def create 12 @lesson = Lesson.new(lesson_params) 13 @lesson.adviser = current_user.adviser 14 @lesson.posted_at = Time.current 15 if @lesson.save 16 redirect_to [current_user, :user_lessons] 17 else 18 flash.now.alert = '入力に誤りがあります。入力必須項目を確認して下さい。' 19 render "new" 20 end 21 end 22 23 def update 24 @lesson = current_user.adviser.lessons.find(params[:id]) 25 @lesson.assign_attributes(lesson_params) 26 if @lesson.save 27 redirect_to [current_user, :user_lesson] 28 else 29 flash.now.alert = '入力に誤りがあります。入力必須項目を確認して下さい。' 30 render "edit" 31 end 32 end

ruby

1#new.html.erb 2<%= form_for [:user, @lesson] do |f| %> 3<%= render "form", f: f %> 4<%= f.submit '作成する' %> 5 6#edit.html.erb 7<%= form_for [:user, @lesson], url: :user_user_lesson, html: {multipart: true} do |f| %> 8 <%= render "form", f: f %> 9 <%= f.submit "編集する" %> 10 11#_form.html.erb 12<%= f.label :title, "レッスン名" %> 13<%= f.text_field :title %>等、lessonモデルのcolumnが並びます。 14 <%= f.fields_for :lesson_images do |limg|%> 15 <%= limg.label :lesson_image, "レッスン写真" %> 16 <%= limg.file_field :lesson_image, class:"form-control-file", id:"exampleInputFile" %> 17 <% end %>

newの画面は3つファイルを選択を表示
イメージ説明

newにて1つしか画像をアップロードしなかった場合、当該レッスンをeditする画面で、ファイルを選択は1つしか表示されない。
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

まあ、そのまんまの回答で恐縮ですが。

ruby

1 def edit 2 @lesson = current_user.adviser.lessons.find(params[:id]) 3 t=3-@lesson.lesson_images.size.to_i 4 t.times{@lesson.lesson_images.build} 5 end 6

一応解説(いらないか)
3から@lessonに紐づいているlesson_imagesの数を引いて
その回数だけlesson_imagesをbuildしている。

投稿2017/04/12 13:07

moke

総合スコア2241

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

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

innjera

2017/04/12 13:59

うまくいきました、勉強になりました!有難うございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問