1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

複数枚投稿する際に、投稿ボタンを押すとエラーが出た際の解決

Posted at

プログラミング学習2ヶ月間。
Qiita初投稿。

写真複数枚投稿機能にて詰まったため、備忘録としてアウトプット。

今回詰まった内容としては複数枚投稿する際に、投稿ボタンを押すとエラーが出たといった内容。

抜粋コード記述

new.html.erb

<%= f.file_field :images, name: 'post[images][]', id: "item-image" %>
      <div class="items-box-img", id="image-lists" ></div>
      <% @post.images.each do |image| %>
        <%= image_tag image, class: 'item-box-img' %>
      <% end %>

routes.rb

resources :posts do
    resources :comments, only: :create
    collection do
      get 'search'
    end
  end

posts_controller.rb

class PostsController < ApplicationController
  before_action :authenticate_user!, except: [:index, :show]
  before_action :set_q, only: [:index, :search]
  before_action :set_item, only: [:edit, :show, :update, :destroy]
  before_action :redirect, only: [:edit, :destroy]

  def index
    @posts = Post.includes(:user).order("created_at DESC")
  end

  def new
    @post = Post.new
  end

  def create
    @post = Post.new(post_params)
    if @post.save
      redirect_to posts_path
    else
      render :new
    end
  end

  def show
    @comment = Comment.new
    @comments = @post.comments.includes(:user).order("created_at DESC")
  end

  def edit
  end

  def update
    return redirect_to posts_path if @post.user != current_user
    if @post.update(post_params)
      redirect_to post_path(@post.id)
    else
      render :edit
    end
  end

  def destroy
    @post.destroy
    redirect_to posts_path
  end

  def search
    @results = @q.result
  end

  private

  def post_params
    params.require(:post).permit(:name, :post_text, images: []).merge(user_id: current_user.id)
  end

  def set_q
    @q = Post.ransack(params[:q])
  end

  def set_item
    @post = Post.find(params[:id])
  end

  def redirect
    redirect_to posts_path if @post.user != current_user
  end
end

post.rb

class Post < ApplicationRecord
  belongs_to :user
  has_many_attached :images
  has_many :comments, foreign_key: :post_id, dependent: :destroy

  with_options presence: true do
    validates :name
    validates :image
  end
end

今回、投稿機能の保存に関してうまく作動していなかった。
エラー画面から読みとくに、画像データがsaveできてませんよというエラーが出た。
コントーラーのcreateアクションにbinding.pryをかけて、params内部を確認してみると、データは正常に送信されている状態であった。

そのため、記述のタイプミスがないかの確認と、なぜ画像データだけ保存ができないのかという点に着目した。

保存の処理という点で再度モデルを確認。

すると、
has_many_attached :images

上記は正確に記述できているよなと確認し直したが、やはりエラーの状態のままであった。

再度、コントローラーに定義したストロングパラメーターの記述

def post_params
    params.require(:post).permit(:name, :post_text, images: []).merge(user_id: current_user.id)
  end

を確認を行ったが問題なく記述はできている。
値は送信できているのになぜ保存の処理ができないかと考え、再度モデルの記述を確認しにいった。

そうしたら、7行目に記述してある
validates :image
が原因だと突き詰められた。

複数枚の処理を行うのに対して、単数形でimageが記述してあったのが原因と突き止められた。

記述修正して、
validates :images
に変えたら問題なく保存の処理が行われ、表示に関しても問題なく動作した。

複数枚の機能に変更した際に、バリデーションも複数形の記述にしなくてはいけないというところを、すっかり飛ばしていたのがエラーの原因と考えついた。

初心者でまだまだわからないことも多いが改めて、複数形・単数形の記述の仕方には注意しなくてはいけないと再認識できたエラーであった。

これからも備忘録やアウトプットとして投稿できていけたらと思っています。

初心者ながら、もっと良い記述の仕方や、アドバイス等ありましたらお聞きできましたら幸いです。

宜しくお願い致します。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?