見出し画像

Ruby on Rails5 学習メモ #04

仕事でエンジニアの方々が使っている言語がRailsなのでなんとなくでも理解をできたらと思い、休みの日に少しずつProgateで学んだことのメモしていく。vol.4.

getとpostルーティング

Railsではgetとpostでは別のルーティングとして扱われる。link_toメソッドの場合は、get。form_tagメソッドの場合はpost。

# get送信
<%= link_to("ログイン","/login") %>
get "login" => "users#login_form"

# post送信
<%= form_tag("/login") do %>
<% end %>

エラーメッセージの自作

通常バリデーションで表現できない場合、エラーメッセージは自作する。

# コントローラー
@error_message = "エラーメッセージ"

# ビュー
<%= @error_message %>

変数session格納

セッションはsession[:キー名] = 値で格納する

# コントローラー
session[:user_id] = @user.id

# ビュー
<%= session[:user_id] %>

変数session破棄

セッションの値を破棄するにはnilを代入する

session[:user_id] = nil

全アクションで共通する処理はbefore_action

各コントローラの全アクションで共通する処理がある場合には、before_actionを使うと1箇所にまとめることができる。

# コントローラー
before_action 全アクションで共通する処理

全てのコントローラで共通する処理applicationコントローラにまとめる

全てのコントローラで共通する処理はapplicationコントローラにまとめることができる。下記例は、セッションのIDからusersテーブルからログイン中のユーザー情報を変数に格納している。

# application_controller.rb
before_action :set_current_user

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

before_actionを特定のアクションのみで実行する

onlyを用いて各コントローラでbefore_actionを使うことで、指定したアクションでのみ、そのメソッドを実行することができる。下記例だとauthenticate_userメソッドはeditとupdateアクションでしか実行できない。applicationコントローラを継承しているので、継承元のメソッドを使うことができる。

# users_controller.rb
before_action :authenticate_user, {only:[:edit, :update]}

# application_controller.rb
def authenticate_user
    ...
end

# users_controller.rb
class UsersController < ApplicationController
    # 継承先でも使える。
    before_action :authenticate_user
end

---

nilってなに?nullってこと?って思って調べたら英語で「なし」って意味だった。Rubyって日本人が作った言語なのに、PHPとかより英語要素が強い気がする…。いや、オレの英語力がないだけか…。

nullbefore_actionはめちゃくちゃ気をつけて使わないとバグの温床になりそう。あと、未だに「:(コロン)」を前に付けるのか、後ろに付けるのかよく分からない。うう、いくつか言語学んできたけど、RubyとRailsは一番書きにくい…。文系プログラマーだからか?