BNBのプログラミング勉強記録

ガチのプログラミング初心者が駆け上がっていくブログ

ProgateのRailsレッスンのまとめ

説明

ProgateのRailsレッスンで得た知識の要約。このブログやProgateを検索したり、既に学んだことを再度ググるのがめんどくなったのでチートシート的に活用。(ただ、例えばform_tagとかググると、色んなフォームの書き方があることを知ったりできるので、Progateで知ったメソッドとかを再度ググるのは悪いことではないなとは思った。)

ちなみにアプリを使ってもらう前提なので、Progateでは習ってないけどherokuの一連の手順も入れている。
→2023/06/14追記。herokuは別記事にしました。
https://blue-night-blue.hatenablog.com/entry/2023/06/14/163246

ターミナルに書くやつ

  • アプリを作る:rails new アプリ名
  • コントローラーを作る:rails g controller コントローラー名 アクション名
  • モデル(テーブル)を作る:rails g model モデル名(最初大文字で単数形) カラム名:データ型 カラム名:データ型 ※データ型の例:string,text,integer
  • モデルに変更を加える:rails g migration カラムを追加するよ的な名前

モデルに書くやつ

空白は駄目

validates :content, {presence: true}

上記+文字数制限

validates :content, {presence: true,length:{maximum:140}}

重複禁止

validates :email,{uniqueness:true}

インスタンスメソッド(例)

######従来
#posts_controller.rb
def show
    @post = Post.find_by(id: params[:id])
    @user = User.find_by(id: @post.user_id)
end


######インスタントメソッド使用
#post.rb
def user
    return User.find_by(id: self.user_id)
end

#posts_controller.rb
def show
    @post = Post.find_by(id: params[:id])
    @user = @post.user
end

コントローラーに書くやつ

並び替え

@posts = Post.all.order(created_at: :desc)
#ascで昇順

戻す(redirect_toと違って、変数をそのまま使える)

render("ビューファイルのあるフォルダ名/ビューファイル名")

フラッシュ

flash[:notice]="メッセージ"

画像を受け取って保存

if params[:image]
      @user.image_name="#{@user.id}.jpg"
      image=params[:image]
      File.binwrite("public/user_images/#{@user.image_name}",image.read)
end

find_byで複数条件

@user=User.find_by(email: params[:email],password: params[:password])

session変数

def login
    @user = User.find_by(email: params[:email], password: params[:password])
    if @user
      session[:user_id]=@user.id
#後略

ログアウト

def logout
    session[:user_id] = nil
    flash[:notice] = "ログアウトしました"
    redirect_to("/login")
end

ビフォーアクション

before_action :set_current_user

ビフォーアクションを特定のアクションのみに適用

before_action :authenticate_user,{only: [:index, :show, :edit, :update]}

セッションIDがユーザーIDと一致するユーザーをセット

#ApplicationController
def set_current_user
    @current_user = User.find_by(id: session[:user_id])
end

#ApplicationController
before_action :set_current_user

ログインしているか判定

#ApplicationController
 def authenticate_user
    if @current_user == nil
      flash[:notice] = "ログインが必要です"
      redirect_to("/login")
    end
  end

#UsersController
  before_action :authenticate_user, {only: [:index, :show, :edit, :update]}

#PostsController
  before_action :authenticate_user

#LikesController
  before_action :authenticate_user

ログインしてたらログイン画面から追い出す

#ApplicationController
  def forbid_login_user
    if @current_user
      flash[:notice] = "すでにログインしています"
      redirect_to("/posts/index")
    end
  end

#UsersController
  before_action :forbid_login_user, {only: [:new, :create, :login_form, :login]}

自分じゃないユーザーページに行ったら追い出す

#UsersController
  def ensure_correct_user
    if @current_user.id != params[:id].to_i
      flash[:notice] = "権限がありません"
      redirect_to("/posts/index")
    end
  end

#UsersController
  before_action :ensure_correct_user, {only: [:edit, :update]}

自分の投稿じゃないやつをいじろうとしたら追い出す

#PostsController
  def ensure_correct_user
    @post = Post.find_by(id: params[:id])
    if @post.user_id != @current_user.id
      flash[:notice] = "権限がありません"
      redirect_to("/posts/index")
    end
  end

#PostsController
  before_action :ensure_correct_user, {only: [:edit, :update, :destroy]}

いいね数を表示

@likes_count=Like.where(post_id: @post.id).count

erbに書くやつ

<%= link_to("表示名","/コントローラー/アクション") %>

eachでモデルからデータを引っ張り出す

<% @配列の変数.each do |任意の変数| %>
      <div>
          <%= 任意の変数.配列のカラム名 %>
      </div>
<% end %>

フォーム

<%= form_tag("/コントローラー/アクション") do %>
      <textarea name="content"></textarea>
      <input type="submit" value="投稿">
<% end %>
<%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"}) %>

errorsメソッド

<% @post.errors.full_messages.each do |message| %>
    <%= message %>
<% end %>

フラッシュ

<%= flash[:notice] %>

フォーム(画像送信)

<%= form_tag("/users/#{@user.id}/update", {multipart: true}) do %>
          <input name="image" type="file">
          <input type="submit" value="保存">
<% end %>

パスワード非表示

<input type="password">

session変数

<% if session[:user_id] %>
       現在ログインしているユーザーのid:
        <%= session[:user_id] %>
<% end %>

ログアウト(session変数をいじる際もpostを使う)

<%= link_to("ログアウト", "/logout",{method: "post"})  %>
<%= link_to("/likes/#{@post.id}/destroy", {method: "post"}) do %>
          <span class="fa fa-heart liked-btn"></span>
<% end %>

マイグレーションファイルに書くやつ(change内)

追加

add_column :モデル名の複数形(小文字), :カラム名, :データ型

#サンプル
add_column :posts, :post_id, :integer
#「:posts ,」というようにスペース入ってると通らない!要注意!!
#ちなみにPost2というモデルなら「:post2s」になる。俺のようにトチったらこうなる。

削除

remove_column :同上

git

  1. githubへ行き新規のリポジトリを作る
  2. 上記のリポジトリURLをコピーしとく
  3. cdでアプリのディレクトリへ行く(違うところにおらんように。add出来んくなるぞ!)
  4. git init
  5. git remote add origin リポジトリURL
  6. git add .
  7. git commit -m "メッセージ"
  8. git push origin main

bcrypt関係

  • gemに書くやつ:gem "bcrypt"
  • ターミナルに書くやつ:bundle insatall
  • コントローラー作成時にターミナルに書くやつ:password_digest:string
  • モデルに書くやつ:has_secure_password
  • ここまでやったら、一旦rails sを切る、そして再度立ち上げ。
  • コントローラーに書くやつの一例:if @テーブルから取得した変数.authenticate(params[:password])