前提・実現したいこと
複数の場所の情報を持った投稿を作成する機能を実装したいです。(1つのpostに対して複数のspot)
そのために、
①新規投稿フォームの一部(fields_for部分)を複製し、値を初期化した状態で配置
②コピー元のフォームも含めて、fields_forのデータをすべて別のレコードとして保存
という処理を行いたいのですが、方法がわからずハマっています。
具体的には、
「フォームを追加」をクリックすると、fields_forを囲った<div>のクローンが、入力された値が初期化された状態で下に追加される。
「投稿」ボタンをクリックしたときに、ページ内のすべてのフォームのデータが保存される(postとそれに紐付いたspotすべて)。というのを想定しています。
spotモデルには、post_id属性を持たせており、同一のpost_idを持ったレコードは1つのpostに紐付いている状態です。
発生している問題・エラーメッセージ
現状のコードでは、
・追加されたフォームには、コピー元のフォームに入力された値が残った状態で追加される
・フォームを追加した場合、最後に追加されたフォームのデータしか保存されない
(コピー元や、コピー元と最後のフォームに挟まれたフォームが保存されない)
該当のソースコード
post.rb
ruby
1 belongs_to :user 2 has_many :spots, dependent: :destroy 3 accepts_nested_attributes_for :spots 4 mount_uploader :image, ImageUploader
spot.rb
ruby
1 belongs_to :post 2 mount_uploader :image, ImageUploader 3 4 validates :title, length: {maximum: 30} 5 #validates :post_id, presence:true 6 validates :content, presence:true, length: { maximum: 140 } 7 validate :image_size 8 9 #住所を変換して、緯度をlattude、経度をlongitudeに保存 10 geocoded_by :address 11 after_validation :geocode
posts_controller.rb
ruby
1def new 2 @post = Post.new 3 @post.spots.build 4 end 5 6def create 7 @post = current_user.posts.build(post_params) 8 @post.save 9 redirect_to root_path 10 end 11 12def post_params 13 params.require(:post).permit(:content, spots_attributes: [:address, :image, :content, :title]) 14 end
posts/new.html.erb
html
1<div class="container"> 2 <h1 class="form-heading">投稿する</h1> 3 <%= form_with model: @post do |f|%> 4 <div class="field"> 5 <%= f.text_area :content, placeholder: "post.content"%><br> 6 <div id="forms"> 7 <div class="spot-form"> 8 <%= f.fields_for :spots do |s| %> 9 <%= s.text_field :title, placeholder: "title"%><br> 10 <%= s.text_field :address, placeholder: "address"%><br> 11 <%= s.text_area :content, placeholder: "spot.content"%> 12 <span class="image"> 13 <%= s.file_field :image, accept: 'image/jpeg,image/gif,image/png' %> 14 </span><br> 15 <% end %> 16 </div> 17 </div> 18 </div> 19 <div class="btn btn-primary" id="add-form">フォームを追加</div> 20 <%= f.submit "投稿", class: "btn btn-primary" %> 21 22 <% end %> 23 24</div> 25 26<!-- フォームの追加 --> 27<script> 28$(function(){ 29 $('#add-form').on('click',function(){ 30 var clone = $('#forms .spot-form:first').clone(true); 31 clone.appendTo('#forms') 32 }); 33}); 34</script>
spotsテーブル
ruby
1t.string :title 2t.text :content 3t.string :image 4t.string :address 5t.float :latitude 6t.float :longitude 7t.references :post, foreign_key: true 8t.timestamps
postテーブル
ruby
1t.text :content 2t.references :user, foreign_key: true
試したこと
jQueryや素のJavaScriptなどを使わず、fields_for部分をコピペして、最初からフォームが複数用意された状態にすると、すべてのフォームのデータが保存されました。
補足
postとspotで紛らわしくてすみません…
もし分かりづらい点や、不足情報があればご指摘ください
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/16 01:37
退会済みユーザー
2020/11/16 11:46