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は一番書きにくい…。文系プログラマーだからか?