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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Q&A

1回答

1108閲覧

Rails formオブジェクトを使ったファイル複数投稿について

tiki

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/05/13 12:59

前提・実現したいこと

グループチャットでファイルを複数投稿できる機能を実装したいと考えています。
accepts_nested_attributes_forを使った記事は色々と出てきたのですが、railsで非推奨のようなので、formオブジェクトを使って実装したいと考えています。
ファイルを一つ登録することはできたのですが、複数になるとエラーが出てしまうので、解決法をご教示いただきたくお願いいたします。

発生している問題・エラーメッセージ

Started POST "/groups/3/posts" for ::1 at 2020-05-13 21:47:14 +0900 Processing by PostsController#create as JS Parameters: {"utf8"=>"✓", "authenticity_token"=>"+7Eo7zn4ZV9iUtNwwDblXCl8lD8bzPMaXHdJKds7aReR0h0uwwUmQYWpSNckAwYDTiXLkFgCgUlPXIbRaCfIlA==", "post_form"=>{"content"=>"fkeow", "post_files"=>[#<ActionDispatch::Http::UploadedFile:0x00007fbb2d0c6378 @tempfile=#<Tempfile:/var/folders/gm/3x08djsx5q1193tb3f6s9x0w0000gn/T/RackMultipart20200513-6222-wqk18b.jpg>, @original_filename="kodomo_sunaba.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"post_form[post_files][]\"; filename=\"kodomo_sunaba.jpg\"\r\nContent-Type: image/jpeg\r\n">, #<ActionDispatch::Http::UploadedFile:0x00007fbb2d0c6328 @tempfile=#<Tempfile:/var/folders/gm/3x08djsx5q1193tb3f6s9x0w0000gn/T/RackMultipart20200513-6222-1tt46fi.jpg>, @original_filename="koukousei_boy.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"post_form[post_files][]\"; filename=\"koukousei_boy.jpg\"\r\nContent-Type: image/jpeg\r\n">]}, "commit"=>"投稿", "group_id"=>"3"} User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 ORDER BY `users`.`id` ASC LIMIT 1 ↳ /Users/miyu/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.4.2/lib/active_record/log_subscriber.rb:98 Group Load (0.2ms) SELECT `groups`.* FROM `groups` WHERE `groups`.`id` = 3 LIMIT 1 ↳ app/controllers/posts_controller.rb:33 Completed 500 Internal Server Error in 4ms (ActiveRecord: 0.5ms) NoMethodError (undefined method `[]' for nil:NilClass): app/forms/post_form.rb:13:in `save' app/controllers/posts_controller.rb:19:in `create'

該当のソースコード

ruby

1#app/forms/post_form.rb 2class PostForm 3 include ActiveModel::Model 4 include ActiveModel::Attributes 5 6 attr_accessor :content, :post_files, :group_id, :user_id 7 8 validates :content, presence: true 9 10 def save 11 return false if invalid? 12 13 post = Post.new(content: content, group_id: group_id, user_id: user_id) 14 unless to_param[:post_files].nil? 15 to_params[:post_files].each do |file| 16 post.post_files.new(file: file) 17 end 18 end 19 post.save 20 end 21end

ruby

1#posts_controller.rb 2class PostsController < ApplicationController 3 before_action :set_group 4 5 def index 6 @post_form = PostForm.new 7 @posts = @group.posts.includes(:user) 8 @looks = Look.new 9 end 10 11 def show 12 @post = Post.find(params[:id]) 13 @looks = Look.new 14 @comment = Comment.new 15 @comments = @post.comments.includes(:user) 16 end 17 18 def create 19 @post_form = PostForm.new(post_params) 20 if @post_form.save 21 redirect_to group_posts_path(@group) 22 else 23 @posts = @group.posts.includes(:user) 24 render :index 25 end 26 end 27 28 private 29 def post_params 30 params.require(:post_form).permit(:content, post_files: []).merge(user_id: current_user.id, group_id: params[:group_id]) #<----------ここでエラーが起きている? 31 end 32 33 def set_group 34 @group = Group.find(params[:group_id]) 35 end 36end

ruby

1#models/post.rb 2class Post < ApplicationRecord 3 belongs_to :group 4 belongs_to :user 5 has_many :post_files, dependent: :destroy 6 has_many :comments 7 has_many :looks, dependent: :destroy 8end

ruby

1#models/post_file.rb 2class PostFile < ApplicationRecord 3 belongs_to :post 4 5 mount_uploader :file, ImageUploader 6end

haml

1= form_with model:[@group, @post_form], url: group_posts_path do |f| 2 = f.text_area :content, class: 'input-box__content', placeholder: '投稿文を入力してください' 3 .input-box__bottom 4 = f.label :post_files, class: 'input-box__bottom__files' do 5 = icon('fa', 'paperclip') 6 = f.file_field :post_files, multiple: true, class: 'input-box__bottom__files__file' 7 = f.submit '投稿', class: 'submit-btn'

試したこと

NoMethodError (undefined method `[]' for nil:NilClass)からparamsがおかしいと思い、paramsおよびformなどのpost_filesをfilesやfileにして試してみましたが、結果は変わりませんでした。

補足情報(FW/ツールのバージョンなど)

Ruby on Rails 5.2.3
carrierwave

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

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

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

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

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

guest

回答1

0

このサイトが参考になるかもしれません。

https://qiita.com/maru_u/items/238027a1d3580e04cb12

ruby

1def post_params 2 params.require(:post_form).permit(:content, post_files: []).merge(user_id: current_user.id, group_id: params[:group_id]) 3end

.permit(:content, post_files: [])ですが、.permit(:content, {post_files: []})のようにハッシュにする必要があるかもしれません。

投稿2020/05/13 13:59

gnfreeworks

総合スコア306

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

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

tiki

2020/05/14 01:46

回答ありがとうございます。 .permit(:content, {post_files: []})にしてみましたが、同じエラーが出てしまいました。 添付していただいたサイトも参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問