プログラミング学習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
に変えたら問題なく保存の処理が行われ、表示に関しても問題なく動作した。
複数枚の機能に変更した際に、バリデーションも複数形の記述にしなくてはいけないというところを、すっかり飛ばしていたのがエラーの原因と考えついた。
初心者でまだまだわからないことも多いが改めて、複数形・単数形の記述の仕方には注意しなくてはいけないと再認識できたエラーであった。
これからも備忘録やアウトプットとして投稿できていけたらと思っています。
初心者ながら、もっと良い記述の仕方や、アドバイス等ありましたらお聞きできましたら幸いです。
宜しくお願い致します。