前提・実現したいこと
グループチャットでファイルを複数投稿できる機能を実装したいと考えています。
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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/14 01:46