グロースエンジニアのブログ

Ruby on Rails エンジニアです!開発に当たって勉強したことをまとめていこうと思います!

【Rails5】gem omniauth-google-oauth2 のrspecテストではまった

ログインテストを書いていてハマったのでメモ。

以下を参考にテストを書いていた。

Integration Testing · omniauth/omniauth Wiki · GitHub

Rails + Devise + OmniAuth で Facebook/Twitter の OAuth 認証を RSpec + Capybara でインテグレーションテスト(RequestSpec) | EasyRamble

How to Test Drive OmniAuth Google OAuth2 for your Rails App — Jesse Spevack

 

なるほど!なるほど!と思いながら真似してやっていたが、上手く行かず...

rspec 内に binding.pry を仕込んで中を見てみると上手く設定できてないみたいで、デフォルトのパラメータが返ってくる。

[3] pry(#<Users::OmniauthCallbacksController>)> request.env['omniauth.auth']
=> {"provider"=>"default",
"uid"=>"1234",
"info"=>{"name"=>"Example User"}}

omniauth-google-oauth2 を使っている場合は google_oauth2

原因は mock を作るときに以下のように google を設定していたこと。

OmniAuth.config.mock_auth[:google]

これを google_oauth2 に修正したら上手くいきました!

OmniAuth.config.mock_auth[:google_oauth2]

mock を使ったテスト自体ほとんど書いたことがなかったので、これを解決するのにハマってしまった...

【Rails5】devise でログイン後、ログアウト後のページを設定する

ユーザーがログインした後、ログアウトした後のページへの遷移をデフォルトのものから変更したいと思います。

以下のページの項目を読むと after_sign_in_path_for と after_sign_out_path_for をオーバーライドしてねってあるので、その通りやっていきます。

GitHub - plataformatec/devise: Flexible authentication solution for Rails with Warden.

application_controller.rb に追記

以下のように after_sign_in_path_for にログイン後のページ、 after_sign_out_path_for にログアウト後のページを設定するとリダイレクトしてくれます。

class ApplicationController < ActionController::Base
before_action :authenticate_user!

def after_sign_in_path_for(resource)
mypage_root_path # ログイン後に遷移するpathを設定
end

def after_sign_out_path_for(resource)
new_user_session_path # ログアウト後に遷移するpathを設定
end
end

思ったよりサクッといけました!

 

devise 関連記事はこちら

【Rails5】devise でログイン機能を実装する

【Rails5】devise を日本語化する

【Rails5】devise でログイン後ページをユーザー意図に合わせて変更する

【Rails5】devise を日本語化する

前回はログイン機能の実装を行いましたが、今回はこれを日本語化していきたいと思います。

デフォルトのロケールを設定する

deviseのページに方法が書いてあるので、これどおりにやっていきます。

I18n · plataformatec/devise Wiki · GitHub

config/application.rb にデフォルトのロケールを設定します。

config.i18n.default_locale = :ja

デフォルトで何か設定されている場合は修正してください。

 日本語化ファイルを設定する

config/locales/devise.ja.yml というファイルを作成し、上記ページにある日本語翻訳ファイルをコピペします。 

# Additional translations at https://github.com/plataformatec/devise/wiki/I18n

ja:
  devise:
    confirmations:
      confirmed: 'アカウントを登録しました。'
      send_instructions: 'アカウントの有効化について数分以内にメールでご連絡します。'
      send_paranoid_instructions: "あなたのメールアドレスが登録済みの場合、本人確認用のメールが数分以内に送信されます。"
    failure:
      already_authenticated: 'すでにログインしています。'
      inactive: 'アカウントが有効化されていません。メールに記載された手順にしたがって、アカウントを有効化してください。'
      invalid: "%{authentication_keys} もしくはパスワードが不正です。"
      locked: 'あなたのアカウントは凍結されています。'
      last_attempt: 'あなたのアカウントが凍結される前に、複数回の操作がおこなわれています。'
      not_found_in_database: "%{authentication_keys} もしくはパスワードが不正です。"
      timeout: 'セッションがタイムアウトしました。もう一度ログインしてください。'
      unauthenticated: 'アカウント登録もしくはログインしてください。'
      unconfirmed: 'メールアドレスの本人確認が必要です。'
    mailer:
      confirmation_instructions:
        subject: 'アカウントの有効化について'
      reset_password_instructions:
        subject: 'パスワードの再設定について'
      unlock_instructions:
        subject: 'アカウントの凍結解除について'
      password_change:
        subject: 'パスワードの変更について'
    omniauth_callbacks:
      failure: "%{kind} アカウントによる認証に失敗しました。理由:(%{reason})"
      success: "%{kind} アカウントによる認証に成功しました。"
    passwords:
      no_token: "このページにはアクセスできません。パスワード再設定メールのリンクからアクセスされた場合には、URL をご確認ください。"
      send_instructions: 'パスワードの再設定について数分以内にメールでご連絡いたします。'
      send_paranoid_instructions: "あなたのメールアドレスが登録済みの場合、パスワード再設定用のメールが数分以内に送信されます。"
      updated: 'パスワードが正しく変更されました。'
      updated_not_active: 'パスワードが正しく変更されました。'
    registrations:
      destroyed: 'アカウントを削除しました。またのご利用をお待ちしております。'
      signed_up: 'アカウント登録が完了しました。'
      signed_up_but_inactive: 'ログインするためには、アカウントを有効化してください。'
      signed_up_but_locked: 'アカウントが凍結されているためログインできません。'
      signed_up_but_unconfirmed: '本人確認用のメールを送信しました。メール内のリンクからアカウントを有効化させてください。'
      update_needs_confirmation: 'アカウント情報を変更しました。変更されたメールアドレスの本人確認のため、本人確認用メールより確認処理をおこなってください。'
      updated: 'アカウント情報を変更しました。'
    sessions:
      signed_in: 'ログインしました。'
      signed_out: 'ログアウトしました。'
      already_signed_out: '既にログアウト済みです。'
    unlocks:
      send_instructions: 'アカウントの凍結解除方法を数分以内にメールでご連絡します。'
      send_paranoid_instructions: 'アカウントが見つかった場合、アカウントの凍結解除方法を数分以内にメールでご連絡します。'
      unlocked: 'アカウントを凍結解除しました。'
  errors:
    messages:
      already_confirmed: 'は既に登録済みです。ログインしてください。'
      confirmation_period_expired: "の期限が切れました。%{period} までに確認する必要があります。 新しくリクエストしてください。"
      expired: 'の有効期限が切れました。新しくリクエストしてください。'
      not_found: 'は見つかりませんでした。'
      not_locked: 'は凍結されていません。'
      not_saved:
        one: "エラーが発生したため %{resource} は保存されませんでした:"
        other: "%{count} 件のエラーが発生したため %{resource} は保存されませんでした:"

これで devise に関連する表示は日本語化できました。

モデルも日本語化する

ついでと言っては何ですが、フォームなどに表示される項目も日本語化していきたいと思います。

Email や Password といった表示はモデルの属性によるものなので、 config/locales/models.ja.yml などのファイルを作成し、以下を追記します。

ja:
  activerecord:
    attributes:
      user:
        email: メールアドレス
        password: パスワード
        password_confirmation: 確認用パスワード
remember_me: 次回から自動的にログイン

これでフォームに表示される項目も日本語化できます。

それ以外の日本語化

それ以外の箇所は直接viewにかかれているようなので、それを修正すればいいかと。必要に応じて I18n 化する感じです。

例えば app/views/devise/sessions/new.html.erb がログインフォームなので、このファイルを開いて日本語に書き換えます。

<h2>ログイン</h2>
<%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true %>
</div>

<div class="field">
<%= f.label :password %><br />
<%= f.password_field :password, autocomplete: "off" %>
</div>

<% if devise_mapping.rememberable? -%>
<div class="field">
<%= f.check_box :remember_me %>
<%= f.label :remember_me %>
</div>
<% end -%>

<div class="actions">
<%= f.submit "ログイン" %>
</div>
<% end %>

<%= render "devise/shared/links" %>

 一番最後にある devise/shared/links はフォームの最下部にあるリンクを作成している viewなので、これも必要に合わせて修正してください。

 

以上、 devise の日本語化でした!

 

devise 関連記事はこちら

【Rails5】devise でログイン機能を実装する

【Rails5】devise でログイン後、ログアウト後のページを設定する

【Rails5】devise でログイン後ページをユーザー意図に合わせて変更する

 

Rails アプリを複数(2つ以上)立ち上げる方法

最近マイクロサービスというものを調べる機会があって、記事などを読んでいた。

で、気になったのが「ローカルでどうやって開発するの?」でした。

開発者なら当たり前なのかもしれませんが、こういう機会があって初めて課題に気づき調べて分かることだったのでメモしておきます。

ポートを指定して rails s!

そんなことできたんだな...

通常の `rails s` だと 3000 でアプリが立ち上がる。

複数立ち上げたいときは `rails s -p 4000` とか、`-p ポート番号` って指定してあげればOK!

たとえば上記で rails アプリを立ち上げて、 http://localhost:4000/ にアクセスすれば起動してる。

なるほどな〜とwww

今後の開発

せっかくの機会なので、マイクロサービス周りを調べつつ、テスト的に何か作れればと思っている。

まだまだどういうときに必要で、どういった技術的なものや知識が必要になるのか分かっていないので徐々にやっていくつもりです!

【Rails5】devise でログイン機能を実装する

devise を使ってログイン機能を実装してきます。

2016年7月30日時点で Rails5 対応しているのかちょっとわからなかったのですが、実装できたのでメモしておきます。

その他、devise 関連記事を書いているので参考にどうぞ。

【Rails5】devise を日本語化する

【Rails5】devise でログイン後、ログアウト後のページを設定する

【Rails5】devise でログイン後ページをユーザー意図に合わせて変更する

devise をインストール

Gemfile に以下を追加して、ターミナルから bundle install を実行します。

gem 'devise'

次にターミナルから rails generate devise:install を実行するとインストール手順が表示されます。

➜  app git:(master) rails generate devise:install
Running via Spring preloader in process 33841
      create  config/initializers/devise.rb
      create  config/locales/devise.en.yml
===============================================================================

Some setup you must do manually if you haven't yet:

  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:

       config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

     In production, :host should be set to the actual host of your application.

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root to: "home#index"

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:
     <%= notice %>
     <%= alert %>

  4. You can copy Devise views (for customization) to your app by running:

       rails g devise:views

===========================================================

この手順通りにやっていきます。

1. 開発環境でのメール設定

config/environments/development.rb ファイル内に以下を追記します。

config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

2. route を追加

config/routes.rb に root to: 'home#index' を追加します。

3. ログイン関連の flash メッセージの表示

app/views/layouts/application.html.erb に flash メッセージ用のタグを追加

<%= notice %>
<%= alert %>

4. ログイン関係の view を作成

ターミナルから以下を実行することでログイン関連のviewのベースを作成します。

➜  app git:(master) rails g devise:views
Running via Spring preloader in process 34244
      invoke  Devise::Generators::SharedViewsGenerator
      create    app/views/devise/shared
      create    app/views/devise/shared/_links.html.erb
      invoke  form_for
      create    app/views/devise/confirmations
      create    app/views/devise/confirmations/new.html.erb
      create    app/views/devise/passwords
      create    app/views/devise/passwords/edit.html.erb
      create    app/views/devise/passwords/new.html.erb
      create    app/views/devise/registrations
      create    app/views/devise/registrations/edit.html.erb
      create    app/views/devise/registrations/new.html.erb
      create    app/views/devise/sessions
      create    app/views/devise/sessions/new.html.erb
      create    app/views/devise/unlocks
      create    app/views/devise/unlocks/new.html.erb
      invoke  erb
      create    app/views/devise/mailer
      create    app/views/devise/mailer/confirmation_instructions.html.erb
      create    app/views/devise/mailer/password_change.html.erb
      create    app/views/devise/mailer/reset_password_instructions.html.erb
      create    app/views/devise/mailer/unlock_instructions.html.erb

ログインユーザー用のUserモデルの作成

ターミナルから rails g devise User を実行し、ログインしたユーザーを登録するモデルを作成します。

ログイン後のページを作る

テスト用に以下のようなログイン後のページを作成します。

# app/controllers/mypages_controller.rb
class MypagesController < ApplicationController
  before_action :authenticate_user!

  def show
  end
end


# app/views/mypages/show.html.erb
mypage#show


# config/routes.rb
Rails.application.routes.draw do
  devise_for :users
  root to: 'home#index'

  resource :mypage
end

サーバーを再起動し、http://localhost:3000/mypage にアクセスするとログインページが表示されると思います。

これは、 before_action :authenticate_user! がログインしているかをチェックしており、していなければログインページにリダイレクトされます。

ログイン、ログアウトのリンクを追加する

ログインしていない状態で、ログインが必要なページに直接アクセスするとログインフォームにリダイレクトされます。

ただ、ログインフォームへのリンクとログアウトするリンクが必要となります。

そのためのリンクが以下です。

<% if user_signed_in? %>
  <%= link_to('Logout', destroy_user_session_path, :method => :delete) %>
<% else %>
  <%= link_to('Login', new_user_session_path) %>
<% end %>

これをリンクを追加したい場所に追加すれば大丈夫です。

以上、devise の実装でした。

次は devise を日本語化していきたいと思います。

その他、devise 関連記事はこちら

【Rails5】devise を日本語化する

【Rails5】devise でログイン後、ログアウト後のページを設定する

【Rails5】devise でログイン後ページをユーザー意図に合わせて変更する

Ruby on Rails 5 で新しくアプリを作成する

新しく作りたいものを思い立って、せっかくなので Rails 5 で作ろうと思ったので、その手順を簡単に。

今の自分のローカル環境としては、Rails 4 は動く状態です。

Rails 5 のインストール

リポジトリはこちら。手順も READ ME に書いてあるので、そちらを見た方が早いかもしれません。

ターミナルから以下を実行。

gem install rails

実行結果を見ていくと rails 5 が入ってますね!(長いので省略してます)

Fetching: activesupport-5.0.0.gem (100%)
Successfully installed activesupport-5.0.0
Fetching: rack-2.0.1.gem (100%)
Successfully installed rack-2.0.1
...
Parsing documentation for rails-5.0.0
Installing ri documentation for rails-5.0.0
Done installing documentation for activesupport, rack, rails-dom-testing, actionview, actionpack, activemodel, arel, activerecord, activejob, actionmailer, actioncable, railties, rails after 24 seconds
13 gems installed

アプリの起動

ここから先はいつもどおりです。
※ myapp のところは作るアプリ名に修正

rails new myapp
cd myapp
rails server

f:id:ikdtty0423:20160730140845p:plain

もうちょっとゴニョゴニョやる必要があるかなと思ったけど簡単だった。

これで Rails 5 で開発ができる!

超集中を手に入れる5つのテクニック 〜自分を操る超集中力 メンタリスト DaiGo〜

前から気になっていたメンタリストDaiGo。

人の振る舞いからその人の心理を当てるパフォーマンスをテレビで見て、この人どうやって見抜いてるんだろう?って興味があった。

たまたま本屋にいったらDaiGoの本が複数並んでいて、こんなに本書いてんの?と思いつつ、いい機会なので読んでみようと思った。今回は「自分を操る超集中力」って本の感想を。

集中は作り出せる

集中しているときってそのことに没頭していて、気が付くと1時間、2時間ってあっという間に時間が経つ。

でも、結構気が散って集中できないことも多々ある。

自分のパフォーマンスを上げるにはどうやって集中を作りだすかが鍵になってくる。

そんな方法を脳の研究も合わせて紹介しているのがこの本。

超集中する5つのテクニック

集中するテクニックがたくさん紹介されているので、細かいテクニックは本を読んでもらいたいのですが、僕が大事に思ったことを一言で言うと、「集中できる環境づくり」。

それをピックアップして紹介します。

机には青いもの、青色のペンを使う

色彩心理学で青は集中を促す色。これ、結構前からやっているけど、何となくしっくりきていると思う。

机の上に青いものを置いたり、青色のペンを使うだけなので簡単にできると思う。

気が散るものを排除する

例えばスマホ。集中しててもブルっと震えれば気になってしまう。その時点で集中は切れる。

集中したいときはマナーモード...というか、バイブレーションも止めてしまうのがいいと思う。かばんに入れていてもブルブルすると音が出て気になることもあるので。

それ以外にも電話が鳴らない早い時間に行って仕事するなど邪魔が入らない環境で仕事することが大事。

やることを6つ書き出して優先順位付け

その日にやる6つのことを書き出して優先順位付けし、上から順にやっていく方法。

紙に書き出すことに意味があって、頭に覚えているということは脳を使っているということ。

自分の頭のなかにあるタスクを紙に書きだして脳をクリアにする。それによって目の前のコトの集中できる状態を作れるというわけです。

やることを一つに絞る

僕もよくあるんですが、あれもやらないと、これもやらないとって思って結局ほとんど終わらないという...

先ほどの紙に書き出して優先順位付けしたものを1つずつやっていくことで、それだけに集中して仕事ができる。

複数平行してやるとアイドリング(その仕事をする準備)に時間がかかるので一つのことに集中してやることが大事。

25分仕事、5分休憩

何となく聞いたことがある方もいるかもしれませんが、ポモドーロというやつです。

人の集中できる時間は限られているので適度に休憩を入れて集中を維持することが大事。

僕もやろうと思いつつ、そんな細かく区切ってたらアイドリングに時間かかるし無駄だと思う...って思ってやってなかった。

でも、一つのことに絞ってやるのであれば休憩中も脳はその仕事を考えており問題ないとのこと。

その休憩中にナッツなどの低GI食品で血糖値をコントロールしつつ、1,2時間にコップ1杯の水を飲む。

脳はブドウ糖をエネルギーとしていて、ナッツによって補給しつつ、水分不足による集中力低下を防ぐことができます。

超集中を手に入れる

明日、大事なプレゼンなのに...とか午後までに資料まとめないと...とか集中して一気にやらない場面はたくさんあると思います。

そういうときに限って中々手を付けられなかったりすることもあると思います。

簡単なことから少しずつ始めて集中力を手に入れてみてはいかがでしょうか?

【目次】

まえがき
第1章 集中力を自在に操る3つのルール
 集中力の高い人に共通する行動原則とは
第2章 高い集中力を生み出す7つのエンジン
 トップスピードで「すぐ没頭できる」自分に変わる
第3章 疲れをリセットする3つの回復法
 疲れを感じている方は、ここから読み進めてください
第4章 集中力を自動でつくり出す時間術
 いつもの仕事の時間を変えるだけで、パフォーマンスは上がっていく