Ruby on Rails 入門2

こんにちは。いとうです。前回からの引き続きでTwitter的なの作成していきます。今回はログイン機能までやりたい。↓前回のやつ

homeコントローラーの作成

twitterで言うタイムライン的なページとしてhomeコントローラーを作成 

$ rails g controller home index
     create  app/controllers/home_controller.rb
      route  get 'home/index'
     invoke  erb
     create    app/views/home
     create    app/views/home/index.html.erb
     invoke  test_unit
     create    test/controllers/home_controller_test.rb
     invoke  helper
     create    app/helpers/home_helper.rb
     invoke    test_unit
     invoke  assets
     invoke    coffee
     create      app/assets/javascripts/home.coffee
     invoke    scss
     create      app/assets/stylesheets/home.scss
$ 

http://localhost:3000/home/index 以下のようにページが表示されるか確認。もし出てなかったら、なにかのエラーが出てるはずなので、rails s でサーバ起動してるところで確認する。

スクリーンショット 2020-02-20 12.19.24

で、/home/index のindexが邪魔だから消すための作業 

config/routes.rb

Rails.application.routes.draw do
 get 'home' => 'home#index' # 修正
 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

http://localhost:3000/home 上記の作業がうまく行ってればこれで表示できるようになっているはず。はず。

ログイン機能

railsにはdeviseっていう便利なものがあって秒でログイン機能作れちゃうんです。ほんと神だと思う。

Gemfile

gem 'devise' # 末尾に追記

で↓のコマンドを実行。一応メッセージにはエラーがでてないかを確認

$ bundle install
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Fetching gem metadata from https://rubygems.org/............
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies...
Using rake 13.0.1
Using concurrent-ruby 1.1.6
Using i18n 1.8.2
Using minitest 5.14.0
Using thread_safe 0.3.6
Using tzinfo 1.2.6
Using activesupport 5.2.4.1
Using builder 3.2.4
Using erubi 1.9.0
Using mini_portile2 2.4.0
...以下略
$

で次はこれ。config以下にファイル作られて、使い方の説明ぽいこと言われてる。

$ rails g devise:install
     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:

      <p class="notice"><%= notice %></p>
      <p class="alert"><%= alert %></p>

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

      rails g devise:views

===============================================================================
$

で、次はこれ。これはmodel作ってくれてる模様

$ rails g devise user
     invoke  active_record
     create    db/migrate/20200220034507_devise_create_users.rb
     create    app/models/user.rb
     invoke    test_unit
     create      test/models/user_test.rb
     create      test/fixtures/users.yml
     insert    app/models/user.rb
      route  devise_for :users
$

↑でできたmigrateファイルをdbに反映させる。ログ的にはcreate tableしてindexをはってる感じかな多分

$ rails db:migrate
== 20200220034507 DeviseCreateUsers: migrating ================================
-- create_table(:users)
  -> 0.0091s
-- add_index(:users, :email, {:unique=>true})
  -> 0.0016s
-- add_index(:users, :reset_password_token, {:unique=>true})
  -> 0.0021s
== 20200220034507 DeviseCreateUsers: migrated (0.0165s) =======================
$

viewの作成

ちゃんと見ればわかるけど、app/views/配下に色々とファイルができてるはず。

$ rails g devise:views users
     invoke  Devise::Generators::SharedViewsGenerator
     create    app/views/users/shared
     create    app/views/users/shared/_error_messages.html.erb
     create    app/views/users/shared/_links.html.erb
     invoke  form_for
...以下略
$ 

controllerの作成

怒られた。。。routeの設定やれってことかな?

$ rails g devise:controllers users
     create  app/controllers/users/confirmations_controller.rb
     create  app/controllers/users/passwords_controller.rb
     create  app/controllers/users/registrations_controller.rb
     create  app/controllers/users/sessions_controller.rb
     create  app/controllers/users/unlocks_controller.rb
     create  app/controllers/users/omniauth_callbacks_controller.rb
===============================================================================

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

 Ensure you have overridden routes for generated controllers in your routes.rb.
 For example:

   Rails.application.routes.draw do
     devise_for :users, controllers: {
       sessions: 'users/sessions'
     }
   end

===============================================================================
$

config/routes.rb

怒られたからこれやっとく。多分後々また修正するけど

Rails.application.routes.draw do
  devise_for :users
  get 'home' => 'home#index'
  # 以下の4行を追加
  devise_for :users, :controllers => {
    :registrations => 'users/registrations',
    :sessions => 'users/sessions'
  }
end

http://localhost:3000/users/sign_up このリンクにアクセスして、表示されれば成功。

スクリーンショット 2020-02-20 13.19.34

サインアップしてみると、 http://localhost:3000/ に飛ばされる。わかりづらいけど、サインアップできてる。

スクリーンショット 2020-02-20 13.35.09

確認

こんな感じで表示されてればOK。こーゆー時いつも思うけど、日本時間に変更するの面倒。(4時に作業してるわけではないです

$ rails dbconsole
SQLite version 3.11.0 2016-02-15 17:29:24
Enter ".help" for usage hints.
sqlite> .mode line
sqlite> select * from users;
                   id = 1
                email = aaa@aaa.com
   encrypted_password = $2a$11$GBcVaUitWID2ferNlzlDdOZJdsMmGth6A6PxjUWjLwfgbVwEXP6.m
 reset_password_token =
reset_password_sent_at =
  remember_created_at =
           created_at = 2020-02-20 04:33:44.764439
           updated_at = 2020-02-20 04:33:44.764439
sqlite>.quit
$

git 操作

キリが良いタイミングでコミットしておくと吉

$ git add .
& git commit -m "add: deviseログイン"

今日はこんなところで終了。思ったより長くなった気がする。。。

次の記事


Slackの招待リンク

僕個人(メモ用)のslackチームがあるんだけど、30日間有効なリンク貼っておきます。僕とチャットで話したいといかの物好きは一緒に勉強しましょう。今は暇なので話相手になってもらえたら嬉しいです。