Rails」カテゴリーアーカイブ

Rails Tutorialまとめ(自分のRailsTutorialチートシート)

機能要件

ログイン、ログアウト機能について調べたいとき

ログイン、ログアウト機能(自前で)
https://railstutorial.jp/chapters/basic_login?version=5.1#cha-basic_login

ログイン、ログアウト機能(外部ライブラリ- devise)
https://qiita.com/cigalecigales/items/f4274088f20832252374

ログインしてブラウザを閉じてもログイン状態を維持したい! – Remember me機能
https://railstutorial.jp/chapters/advanced_login?version=5.1#sec-remember_me

新規登録をしたらメールアドレスが送られるやつ
https://railstutorial.jp/chapters/account_activation?version=5.1#cha-account_activation

パスワードを忘れた時に再設定できるやつ
https://railstutorial.jp/chapters/password_reset?version=5.1#cha-password_reset

フラッシュメッセージについて調べたいとき

続きを読む

Dockerでコマンドを忘れた時に見るやつ

コンテナ関連

コンテナの作成

 docker-compose build

コンテナの中身を削除

docker-compose down

コンテナの起動(web serverの起動)

docker-compose.ymlを使って起動します

構文

 docker-compose up [option] [service名]

通常起動

docker-compose up

rails(サービス名)起動

docker-compose up rails

バックグラウンドで実行

docker-compose up -d 
docker-compose up -d rails

buildも実行

docker-compose up -build

buildをしない

 docker-compose up -no-build

コンテナ起動関連

docker-compose start
docker-compose stop

#Gemfileの更新をしたら、実施する
docker-compose restart

コンテナのタイムアウトを秒指定

 docker-compose up -t

サービスの数を指定

docker-compose up -scale SERVICE=サービス数

続きを読む

かんたん登録のつくりかた

かんたん登録とは?

ワンクリックでSign-upとLoginができるユーザーフレンドリーな機能

準備

users/index.html.erbに以下の記述を追加

<%= link_to "簡単ログイン", easy_login_path, method: :get, class: 'btn slide-bg' %>

routes.rbに以下の記述を追加

get "easy_login" => "users#easy_login"

続きを読む

form_forからform_withに移行するには?

form_forからform_withに移行する

before:users/_form.html.erb

<%= form_for user do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
    <div class="inputWithIcon">
    <%= f.text_field :name, class: 'form-field', placeholder: 'Your name' %>
    </div>
  <div class="inputWithIcon">
    <%= f.email_field :email, class: 'form-field', placeholder: 'Email' %>
  </div>
    <%= f.password_field :password, class: 'form-field', placeholder: 'パスワード' %>
    <%= f.password_field :password_confirmation, class: 'form-field', placeholder: 'パスワード確認' %>
    <%= f.submit "登録", class: "btn btn-submit" %>
<% end %>

after:users/_form.html.erb

<div class="new-todo-list-form">
  <%= form_with model: user, local: true do |f| %>
    <%= render 'shared/error_messages', object: f.object %>
      <div class="inputWithIcon">
      <%= f.text_field :name, class: 'form-field', placeholder: 'Your name' %>
      </div>
    <div class="inputWithIcon">
      <%= f.email_field :email, class: 'form-field', placeholder: 'Email' %>
    </div>
      <%= f.password_field :password, class: 'form-field', placeholder: 'パスワード' %>
      <%= f.password_field :password_confirmation, class: 'form-field', placeholder: 'パスワード確認' %>
      <%= f.submit "登録", class: "btn btn-submit" %>
  <% end %>
</div>

local: trueを入れたのはエラーメッセージを表示させるため。

shared/_error_messages.html.erb

<% if object.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-danger">
      <% object.errors.full_messages.each do |msg| %>
        <li><h4><%= msg %></h4></li>
      <% end %></div>
  </div>
<% end %>

local: trueがない場合表示されないが、local: trueを追加されば表示される。

スコープのprefixを指定するとき(ログイン機能など)

before:sessions/new.html.erb

<h1>ログイン</h1>
<div class="login-form">
  <%= form_for(:session, url: login_path) do |f| %>
    <%= f.label :メールアドレス, class: 'label' %>
    <%= f.email_field :email, class: 'form-field' %>
    <%= f.label :パスワード, class: 'label' %>
    <%= f.password_field :password, class: 'form-field' %>
    <%= f.label :次回ログインを省略する, class: "checkbox inline" do %>
      <%= f.check_box :remember_me %>
      <span>次回ログインを省略する</span>
    <% end %>
    <%= f.submit "ログイン", class: "btn btn-submit" %>
  <% end %>
  <br>
  <%= link_to(content_tag(:i, 'はじめての方はこちら',
                          class: "fas fa-angle-double-right faa-horizontal animated-hover fa-pull-left",
                          style: "color: sienna;"), new_user_path) %>
</div>

after:sessions/new.html.erb

<h1>ログイン</h1>
<div class="login-form">
  <%= form_with scope: :session, url: login_path do |f| %>
    <div class="inputWithIcon">
    <%= f.email_field :email, class: 'form-field', placeholder: 'Email' %>
    <%= f.password_field :password, class: 'form-field', placeholder: 'パスワード' %>
    </div>
    <%= f.label :次回ログインを省略する, class: "checkbox inline" do %>
      <%= f.check_box :remember_me %>
      <span>次回ログインを省略する</span>
    <% end %>
    <%= f.submit "ログイン", class: "btn btn-submit" %>
  <% end %>
  <br>
  <%= link_to(content_tag(:i, 'はじめての方はこちら',
                          class: "fas fa-angle-double-right faa-horizontal animated-hover fa-pull-left",
                          style: "color: sienna;"), new_user_path) %>
</div>

scopeを加えるだけ。

Could not find xxxx in any of the sources(エラー対処法)

Could not find xxxx in any of the sourcesとは?

経緯:Macの空き容量が少なくなっていたのでClean / Purge dataで空き容量を増やした後に、

Dockerでdocker-compose upでコンテナを起動した時に発生したエラーです。

解決方法

gemfile.lockの記述を全て削除(まっさらな状態)した後に以下のコマンドをします。

$ rm gemfile.lock
$ docker-compose build
$ docker-compose up

エラーが出なくなっているのを確認したらOKです。

destroy_allの使い方(1対他モデルの一括削除)

destroy_allとは?

すでにテーブルに存在するレコードを一括で削除するメソッドです。

テーブルの状態

usersテーブル(1)にtasksテーブル(多)がhas_manyで紐付いています。

user.rbはこのようになっています。

# == Schema Information
#
# Table name: users
#
#  id              :bigint           not null, primary key
#  admin           :boolean          default(FALSE)
#  email           :string(255)
#  image           :string(255)
#  name            :string(255)
#  password_digest :string(255)
#  remember_digest :string(255)
#  created_at      :datetime         not null
#  updated_at      :datetime         not null
#
class User < ApplicationRecord
  has_many :tasks, dependent: :destroy
  accepts_nested_attributes_for :tasks, allow_destroy: true

1対多の場合は1の方(例としてuserとする)has_many :tasks, dependent: :destroyを追加記述することで、userを消したときに紐付いているtaskも削除されるようにできる!

sessions_helper.rbはこのようになっています(ほぼRailsチュートリアルと同じです)

module SessionsHelper

  # 記憶トークンcookieに対応するユーザーを返す
  def current_user
    if (user_id = session[:user_id])
      @current_user ||= User.find_by(id: user_id)
    elsif (user_id = cookies.signed[:user_id])
      user = User.find_by(id: user_id)
      if user && user.authenticated?(cookies[:remember_token])
        log_in user
        @current_user = user
      end
    end
  end

  # 渡されたユーザーがログイン済みユーザーであればtrueを返す
  def current_user?(user)
    user == current_user
  end

  # 記憶したURL (もしくはデフォルト値) にリダイレクト(フレンドリーフォワーディング)
  def redirect_back_or(default)
    redirect_to(session[:forwarding_url] || default)
    session.delete(:forwarding_url)
  end

end

task.rbはこのようになっています

続きを読む

ポートフォリオ作成で得たテクニック2(備忘録:随時追加)

作成してから時間が立ってだいぶ忘れてきているのですぐに思い出せるように残しておく

1:ページローダーの実装(Rails)

まず初めにPace.jsをコチラから手に入れます

https://raw.githubusercontent.com/HubSpot/pace/v1.0.0/pace.min.js

pace.jsを以下のように配置

SCSSの記述

続きを読む

1対多のモデルについて

経緯

開発しているアプリで必要になったのでまとめ

何がしたいか

usersテーブルに紐付いているIfには複数のThenがあるというのを実装したかった。

参考

Rails Tutorial14章

モデル同士のアソシエーションの記述

モデルとテーブルの関係1(user)

もととなるuserテーブルを作ります。

 migration_file

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string  :name, null: false
      t.string  :email, null: false, unique: true 
      t.timestamps
    end
  end
end

・user.rb
userはたくさんのsituation(if)を持っていて、
situation(if)を通してたくさんのbehavior(then)を持っています。

モデルとテーブルの関係2(behavior)

migration_file
class CreateBehaviors < ActiveRecord::Migration[5.1]
  def change
    create_table :behaviors do |t|
      t.text :name, null: false, unique:true

      t.timestamps
    end
  end
end

reference(参照)はテーブル同士の関係性を示します。

モデルとテーブルの関係3(situation)

ここでbehavior(then)とuserの間を結ぶ中間テーブルを作成しますが、
そこでreferenceというパラメータを使います。

class CreateSituations < ActiveRecord::Migration[5.1]
  def change
    create_table :situations do |t|
      t.references :user, foreign_key: true
      t.references :behavior, foreign_key: true

      t.timestamps
    end
  end
end

・user.rb
userはたくさんのbehavior(then)を持っていて、
situation(if)を通してたくさんのbehavior(then)を持っています。

中間テーブルを通して繋がっているものには
through: :situationsというkeyをつけます。

user.rb
class User < ApplicationRecord
  has_many :behaviors, through: :situations, dependent: :destroy
  has_many :situations,

behavior.rb

User.rbとほぼ同じです。
accepts_nested_attributes_for というkeyは、
他のモデルを一括で更新、保存できるようにするものです。
ここではbehavior(then)を保存するのと同時にsituationsを更新できるようにしています。

behavior.rb

class Behavior < ApplicationRecord
  has_many :users, through: :situations
  has_many :situations
  accepts_nested_attributes_for :situations
end

situation.rb

group_userは1つのuser、1つのbehaviorに属しています。
よって、このように記述します。

class Situation < ApplicationRecord
  belongs_to :user
  belongs_to :behavior
end

Docker+rails環境下でモデルの追加方法と1対多の紐付け

データベースを作成するコマンド

docker-compose exec web bundle exec rake db:create

モデルを追加するコマンド

docker-compose run web bundle exec rails g model task user:references name:string cotent:text

モデルを削除したいときのコマンド

docker-compose run web bundle exec rails destroy model task

データベースを削除する場合はこうする

class CreateMacs < ActiveRecord::Migration[5.1]
 def change drop_table :macs
 end
end

マイグレートするためのコマンド

docker-compose exec web bundle exec rake db:migrate

1つ前にロールバックしたいときのコマンド

docker-compose exec web bundle exec rails db:rollback

seedファイルを使う時に、まずはリセット

docker-compose run web bundle exec rails db:migrate:reset

データベース上にサンプルユーザーを生成する

docker-compose run web bundle exec rails db:seed

1対多の場合は1の方(例としてuserとする)has_many :tasks, dependent: :destroyを追加記述することで、userを消したときに紐付いているtaskも削除されるようにできる!