LoginSignup
0
5

More than 3 years have passed since last update.

【初学者】Gemを使用せず画像投稿機能を実装する【Rails】

Posted at

Progate修了後レベルを対象にした記事になります

画像投稿機能でつまづきました。

Progateで画像情報をアップデートする(既に作成されたユーザー情報のプロフィール画像を変更する)ということは学べました

しかし「新規記事投稿時に画像を添付する」ことは学べなかったので、実装時につまづいてしまいました。

Gemは使用しない

Gemを使用すれば早いかもしれませんが、エラーから目を背けては基礎知識の習得ができないと思い使用しませんでした。

画像添付しない投稿機能

view
    <%= form_tag("/posts/create") do %> 
     <div>
        <input type="text" name ="title">
        <textarea name="content"></textarea>
        <input type="submit" valie="投稿">
     </div>
    <%end%>
post_controller
  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に戻ります。

画像を添付する投稿機能

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>を追加

post_controller
  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が入っていないものになってしまいます。

こうして記事にしてみると、こんな簡単な事だったのかと悲しくなりました・・・。僕の2日間を返してくれ・・・。

0
5
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
0
5