Rails Diary

プログラミングの学習記録です。

復習

課題の反省点

・指定された箇所の実装のみで、フラッシュメッセージの記載は特にしていなかった。
・投稿にバリデーションを記載しなかった。
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で表示する方法

newとbuildの違い - Qiita

Ruby on Rails における build メソッドと new メソッドの違い - Qiita

シンプル認証gem sorceryを完全入門するで!! - Qiita