復習
課題の反省点
・指定された箇所の実装のみで、フラッシュメッセージの記載は特にしていなかった。
・投稿にバリデーションを記載しなかった。
・session[:id] = user.id
の記載をしたが、必要なかった。
・ユーザーとタスクを紐付けるマイグレーションファイルを現場Railsをそのまま参考にしてup,down両方書いたがchangeだけで良かった?
sorceryとdeviseの違い
sorcery…
ジェネレートすることでサブモジュールやなんやを追加してくれるが、処理自体は自分で書く。このためカスタマイズ性に富んでいる。
devise…
ジェネレートすることでログイン機能一式を追加してくれるので、記述量が少なく済む。
add_flash_typesメソッド
*目的
Bootstrapに対応したsuccess
,info
,warning
,danger
の4つのキーを使用したフラッシュメッセージを表示させる。
*方法
add_flash_typesメソッドを使ってキーを許可をする。
下記の用に記述することで許可される。
application_controller.rb
class ApplicationController < ActionController::Base add_flash_types :success, :info, :warning, :danger end
flashメッセージの基本的な使い方として
コントローラ
if user.save flash[:notice] = "登録に成功しました。" redirect_to root_path else render :new end
ビュー
<%= flash[:notice] %>
flashメッセージにbootstrapデザインを当てる
layouts/_flash.html.erb
<p class="alert alert-primary"> ↑primaryの様に色指定をする。
部分テンプレにすると便利
each文を使って、"alert alert-<%= key %>"
のkey
部分に色を、value
にメッセージを指定する
<% flash.each do |key, value| %> <p class="alert alert-<%= key %>"> <%= value %> </p> <% end %>
flashを省略して書くこともできる
<%= notice %> <%= alert %>
require_loginメソッド(sorceryで用意されている)
ログインを強制するメソッド
ログインが必須の画面・コントローラにおいて下記の様に記述
application_controller.rb
before_action :require_login
not_authenticatedメソッド
ログインしていなかった場合に呼ばれるメソッド
一般的には、
ログインしていなかったらフラッシュメッセージを表示する
ログインしていなかったらこのページにリダイレクトをする
の様な処理を書く。
application_controller.rb
private def not_authenticated redirect_to login_path, warning: "Please login first" end
redirect_back_or_to
保存されたURLがある場合はそのURLに飛び、ない場合は指定されたURLにリダイレクトする。
例えば
user#editページに行く→認証が必要→ログインページに飛ぶ
といった挙動において、一旦user#editページは保存され、認証後にeditページにリダイレクトされるといった動きをする。
buildメソッドとは?newメソッドとの違い
*結論
rails4・5系であれば変わらない。
3系の途中辺りからbuildがnewメソッドのエイリアスになったとのこと。
それ以前は、user.rb
の関連にhas_many :posts
がある場合、@user.posts.build
の様にbuildを使うことで自動的にuser_idをセットしてインスタンス生成することができた。
def create @post = current_user.posts.new(post_params) end
※モデルを関連付けした場合、暗黙の了解でbuildを使う慣習があるらしい
def create @post = current_user.posts.build(post_params) end
mine?(object)メソッド
調べてみても特にヒットしなかったので、独自に作られたメソッド?
Userモデルに定義されており、呼び出し元のオブジェクトIDを示すself.id
を略記した記法。
@user.mine?(object)の様に利用すると、object.user_idと@user.idを比較する
user.rb
def mine?(object) object.user_id == id end
<% if current_user.mine?(@post) %>
@post.user_idとcurrent_user.idを比較してくれる
ちなみに自分は下記の様に書いた。
<% if post.user == current_user %>
参考にしたサイト
redirect_to使った時にBootstrap対応のフラッシュメッセージを表示させる - Qiita
【Rails】 完全保存版!flashの使い方とbootstrapで表示する方法