Progate_Ruby on Rails5道場コース4

1・目標物の確認
2・投稿とユーザーの紐付け_準備

・「rails g migration マイグレーションファイル名」をターミナルで実行
・作成されたマイグレーションファイルに「add_column :テーブル名,:カラム名,:データ型」
・「rails db:migrate」でデータベースに反映
・Postモデルにバリデーションを追加

3・投稿とユーザーの紐付け_新規投稿

・Postモデルにuserメソッドを作り戻り値「User.find_by(id: self.user_id)」
・postsコントローラのshowアクションに「@user」を定義(@user=@post.user)
・show.html.erbに指定のコードを貼り付け、
 +画像の表示:<img src="画像の場所">(画像の場所:"<%="/user_images/#{@user.image_name}"%>")
 +ユーザ名のリンク:定義した@userのname

4・投稿一覧にもユーザー情報を表示

・指定のコードをshow.html.erbに貼り付け
 +ユーザー情報と紐付けが必要な画像:「/user_images/#{post.user.image_name}」
  ユーザー名、リンク:「post.user.name, "/users/#{post.user.id}"」

5・ユーザー詳細ページに投稿表示

・userモデルにpostsメソッドを定義
 +@postに「Post .where(user_id: self.id)」
・posts/index.html.erbからコードを借りて貼り付け
 +each文で全件表示できる様にする(@user.posts.each do |post|)

6・投稿の編集、削除

・posts/index.html.erbにif文。
 <% if @current_user.id == @post.user_id %>
・ensure_correct_userメソッドを追加

  def ensure_correct_user
    @post=Post.find_by(id: params[:id])
    if @current_user.id != @post.user_id.to_i
      flash[:notice] = "権限がありません"
      redirect_to("/posts/index")
    end
  end
7・いいね機能_準備

・コンソールで「rails g model Like user_id:integer post_id:integer」を実行
・「rails db:migrate」でデータベースに反映
・Likeモデルにバリデーション追加

8・いいねボタン準備

・ルーティングと、Likeコントローラの手作成

class LikesController < ApplicationController
  before_action :authenticate_user
  
  def create
  end
  
  def destroy
  end
  
end
9・いいねボタンの作成

・likesコントローラのcreateアクションとdestroyアクションを作成
 createアクション
 +@like=Like.new(user_id: @current_user.id,post_id: params[:post_id])
 +redirect先は「/posts/#{params[:post_id]}」
 (destroyアクションはnewではなくfind_by)
・application.html.erbの<head>内に指定のコードを貼り付け(Font awesome
・posts.scssにも指定のコードを貼り付け
・show.html.erb→いいねボタンを表示させるためのコードを追加。
 +createアクションとdestroyアクションどちらも「post」なので{method: "post"}を忘れない。
 +link_toメソッドは<%= link_to("URL") do%> 〜<% end %> で間にHTMLのコード記載のパターン。

 <% if Like.find_by(user_id: @current_user.id, post_id: @post.id) %>
    <%= link_to("/likes/#{@post.id}/destroy",{method: "post"}) do%>        
        <span class="fa fa-heart like-btn-unlike"></span>
    <%end%>
<% else %>
    <%= link_to("/likes/#{@post.id}/create",{method: "post"}) do%>
      <span class="fa fa-heart like-btn"></span>
    <% end %>        
 <%end%>
10・いいね数の表示

・postsコントローラのshowアクションに「@likes_count=Like.where(id: @post.id).count」
・show.html.erbに<%= @likes_count %>追加

11・いいねした投稿の表示

・users/show.html.erbに指定のコードを貼り付け
・ルーティング「"users/:id/likes"」、ビューファイル「likes.html.erb」、usersコントローラにlikesアクション追加
・likesアクション
 +@userにidをユーザーの代入
 +@likes=Like.where(user_id: @user.id)でユーザーがいいねした複数の投稿取得

・likes.html.erb
 +指定のコードの貼り付け、users/show.html.erbの投稿表示するためのコードを貼り付け
 +each文を<% @likes.each do |like|%>に変え、<% post=Post.find_by(id: like.post_id) %>を追加

12・ハッシュ化の準備

・Gemfileに「gem 'bcrypt'」を追加してターミナルで「bundle install」を実行

13・パスワードのハッシュ化、保存

・has_secure_passwordをUserモデルに追加
・password_digestカラムの作成 ※カラムの削除はremove_column
rails db:migrateでデータベースに反映
rails consoleを起動して、idが1のユーザーのパスワードを指定通り実際にハッシュ化する

14・ハッシュ化されたパスワードでログイン

・ログインの条件に「@user.authenticate (params[:password])」を追加。
 +andなので「&&」で条件をつなぐ。(上の文にあるpassword: params[:password]は削除)