Progate修了後レベルを対象にした記事になります
画像投稿機能でつまづきました。
Progateで画像情報をアップデートする(既に作成されたユーザー情報のプロフィール画像を変更する)ということは学べました
しかし「新規記事投稿時に画像を添付する」ことは学べなかったので、実装時につまづいてしまいました。
Gemは使用しない
Gemを使用すれば早いかもしれませんが、エラーから目を背けては基礎知識の習得ができないと思い使用しませんでした。
画像添付しない投稿機能
<%= form_tag("/posts/create") do %>
<div>
<input type="text" name ="title">
<textarea name="content"></textarea>
<input type="submit" valie="投稿">
</div>
<%end%>
def create
@post = Post.new(title: params[:title],
content: params[:content],
user_id: @current_user.id)
if @post.save
flash[:notice] = "投稿しました"
redirect_to("/")
else
render("posts/new")
end
end
ここまではProgateで学んだ知識をそのまま記載しているだけです。
View側から送られた情報をParams[:]で受け取り保存。
redirectで別のViewへ移動しています。
保存に失敗したらもともViewに戻ります。
画像を添付する投稿機能
<%= form_tag("/posts/create",{multipart:true}) do %>
<div>
<input type="text" name ="title">
<textarea name="content"></textarea>
<input type = "file" name ="post_image">
<input type="submit" valie="投稿">
</div>
<%end%>
Viewに関してはProgateで学んだ知識のみで変更可能です。
・form_tagに{multipart:true}
を追加
・画像添付用の<input>
を追加
def create
@post = Post.new(title: params[:title],
content: params[:content],
user_id: @current_user.id,
post_image: nil)
@post.save
if params[:post_image]
@post.post_image = "#{@post.id}.jpg"
image = params[:post_image]
File.binwrite("public/post_images/#{@post.post_image}",image.read)
end
if @post.save
flash[:notice] = "投稿しました"
redirect_to("/")
else
render("posts/new")
end
end
post_image: nil
の記述は無視して構いません。
※DBのテーブル状にpost_imageのカラムがある事をエディタ上でも視覚化したかっただけです。
違うところ
Viewから受け取ったあと、画像の取り込みを行う前に@post.save
することが必要でした。
@post.post_image = "#{@post.id}.jpg"
という記述では「15.jpg」のように「そのpostのid+jpg」に画像ファイル名を定義しています。
しかし@post.save
をしていないと
「まだpost.idがない状態」となってしまい画像ファイル名が「.jpg」というidが入っていないものになってしまいます。