コントローラー作成
ほしいコントローラごとに
admin/
member/
user/,,,
などとし、を先に指定して作成する
rails g controller admin/items
rails g controller admin/genres
rails g controller admin/members
:
rails g controller member/adresses
rails g controller member/items
rails g controller member/cart_items
username:~/environment/naganocake $ rails g controller [namespaceのグループ名]/[コントローラー名]
route.rbを編集 modlue namespace scope
Rails.application.routes.draw do
namespace :[グループ名] do
# グループ内で適用するルーティングをここに記述
# resourcesを使用し一括作成or
# get/post/deleteを指定して、個別に作成可能。
#namespaceはURLパスとファイル構成も指定される。
URL→/member/items/new
end
scope module: :[グループ名] do
# グループ内で適用するルーティングをここに記述
#URLは変えず、ファイル構成だけ指定
URL→/items/new
end
scope :member do
resources :[グループ名]
#URLは指定、ファイル構成変わらず
end
end
collection do や member doでresourcesで生成されないactionのroutingを行う
# member側のルーティング設定
root 'member/items#top' get 'items' => 'member/items#index' フォルダ名/ファイル名#アクション名
get 'about' => 'member/items#about'
scope module: :member do
resources :addresses, :except => [:new]
resources :items,only: [:show,:index]
resources :members,only: [:show,:edit,:update] do
collection do #collection doは、resourcesで生成されないactionのroutingができる
get 'unsubscribe' #URLが /members/unsubscribe(.:format) id付与はしない
patch 'withdraw'
end
end
resources :items do
member do #member doは、resourcesで生成されないactionのroutingができる
get :follow #URLが /items/:id/follow(.:format) id付与される
end
end
end
devise_for :member,controllers: {
sessions: 'members/sessions',
registrations: 'members/registrations',
passwords: 'members/passwords'}
:
# 管理者側のルーティング設定
namespace :admin do
resources :members, :except => [:new,:destroy]
resources :items, :except => [:destroy]
resources :genres, :except => [:new,:show,:destroy]
resources :orders,only: [:show,:update,:index]
resources :ordered_items,only: [:update]
end
devise_for :admin,controllers: {
sessions: 'admins/sessions',
registrations: 'admins/registrations',
passwords: 'admins/passwords'}
ログイン機能2つ作る
gem 'devise'
bundle install
rails g devise:install
モデル2つ作る
rails g devise User
rails g devise Admin
モデルでバリテーション設定しておく
validates :first_name, presence: true
validates :last_name, presence: true
validates :street_address, presence: true #APIで住所検索つけるときは項目分けるので注意
validates :phone_number, format: { with: /\A\d{10,11}\z/ }
# アカウント作成時の電話番号はハイフンなしの10桁もしくは11桁のみ登録可能とするバリデーション
validates :first_name_kana, :last_name_kana, presence: true, format: { with: /\A([ァ-ン]|ー)+\z/, message: "is must NOT contain any other characters than alphanumerics." }
# アカウント作成時の苗字名前のカナ入力欄のカタカナのみ入力可能とするバリデーション
validates :postal_code, format: { with: /\A\d{7}\z/ }
# アカウント作成時の郵便番号はハイフンなしの7桁のみ登録可能とするバリデーション
deviseのテーブルをカスタマイズ
ユーザー登録に必要なもの追記する
class DeviseCreateMembers < ActiveRecord::Migration[5.2]
def change
create_table :members do |t|
:
:
## Lockable
# t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
# t.string :unlock_token # Only if unlock strategy is :email or :both
# t.datetime :locked_at
t.string :last_name, null: false
t.string :first_name, null: false
t.string :last_name_kana, null: false
t.string :first_name_kana, null: false
t.string :post_code, null: false
t.string :address, null: false
t.string :phone_number, null: false
t.boolean :is_deleted, null: false , default: false
t.timestamps null: false ⇦ここデフォルトで入ってる
end
end
end
rails db:migrate
deviseのコントローラに修正が必要なときは、application_controllerに記述する
初期設定ではないカラム(nameなど)をmemberテーブルに追加したので以下で設定
class ApplicationController < ActionController::Base
#以下追記
before_action :configure_permitted_parameters, if: :devise_controller?
protected
:
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:last_name,:first_name,
:last_name_kana, :first_name_kana,:post_code,:address,:phone_number ])
end
end
deviseコントローラーつくる
rails g devise:controllers members
rails g devise:controller admins
ルーティングを直す∵
Rails.application.routes.draw do
devise_for :admins, controllers: {
sessions: 'admins/sessions',
passwords: 'admins/passwords',
registrations: 'admins/registrations'
}
devise_for :users, controllers: {
sessions: 'users/sessions',
passwords: 'users/passwords',
registrations: 'users/registrations'
}
root to: 'home#index'
end
deviseのviewつくる
rails g devise:views members
rails g devise:views admins
モデルを追加しているのでフィールドを追加
sign upページになるので日本語化しておく
<h2>Sign up</h2>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= render "devise/shared/error_messages", resource: resource %>
: #以下追記していく
<tr>
<td class="col-2">名前</td>
<td class="text-right col-1">
<%= f.label :last_name,"(姓)"%>
</td>
<td class="col-3">
<%= f.text_field :last_name, autofocus: true, :placeholder => "令和" %>
</td>
<td class="text-right col-1">
<%= f.label :first_name,"(名)"%>
</td>
<td class="col-3">
<%= f.text_field :first_name, :placeholder => "花子" %>
</td>
</tr>
:
ヘッダー設定しておくとあとで楽になる
<% if admin_signed_in? %>
:
<% elsif member_signed_in? %>
:
<% else %> <!--管理者でも会員でもログインしていないとき-->
<li class="nav-item px-4">
<%= link_to "About", about_path, method: :get, class: 'btn btn-outline-dark' %>
</li>
<li class="nav-item px-4">
<%= link_to "商品一覧", items_path, method: :get, class: 'btn btn-outline-dark' %>
</li>
<li class="nav-item px-4">
<%= link_to "新規登録", new_member_registration_path, class: 'btn btn-outline-dark' %>
</li>
<li class="nav-item pl-4">
<%= link_to "ログイン", new_member_session_path, class: 'btn btn-outline-dark' %>
</li>
</header>
<%= yield %>
</body>
</html>
deviseのフォームヘルパーを変更
deviseではform_forが使用されているため、form_withへと変更しておく
app/views/devise/registrations/new.html.erb
app/views/devise/sessions/new.html.erbを確認する
<%= form_with model
namespaceの影響で
元:ドメイン名/admins/sign_up
今:ドメイン名/admins/admins/sign_up
に変化してしている
∴アクセスして確認する時注意
API使って郵便番号入れるのありかも
アカウント管理 sign_up されたくない場合
:database_authenticatable(パスワードの正確性を検証)
:registerable(ユーザ登録や編集、削除)
:recoverable(パスワードをリセット)
:rememberable(ログイン情報を保存)
:validatable(emailのフォーマットなどのバリデーション)
管理者アカウント admin に対して勝手に sign_up されたくない場合は Admin モデルを修正。 不要部分をコメントアウトしておく
deviseの管理するmodel(userならapp/models/user.rb)から:registerableを抜くかコメントアウトしておく
class Admin < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, # :registerable, ⇦ここの部分
:recoverable, :rememberable, :validatable
end
管理者アカウントはコンソールまたはseedで作成
rails db:migrate:resetした時にデータが全て消えるので注意
$ rails console
> admin= Admin.new
> admin.email = 'admin@example.com'
> admin.password = 'password'
> admin.save