0
0

More than 3 years have passed since last update.

module namespaceを用ひたルーティング  deviseの設定

Last updated at Posted at 2021-08-26

コントローラー作成

ほしいコントローラごとに
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

route.rb
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を行う

route/rb
 # 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'}

ruby
# 管理者側のルーティング設定
   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
gem 'devise'
 bundle install
 rails g devise:install

モデル2つ作る

rails g devise User
rails g devise Admin

モデルでバリテーション設定しておく

model/member.rb
  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のテーブルをカスタマイズ

ユーザー登録に必要なもの追記する

09876521913_devise_create_members.rb
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テーブルに追加したので以下で設定

application_controller.rb
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

ルーティングを直す∵

routes.rb
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ページになるので日本語化しておく

app/views/devise/registrations/new.html.erb
<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>
:

ヘッダー設定しておくとあとで楽になる

app/views/layouts/application.html.erb
 <% 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を抜くかコメントアウトしておく

models/admin
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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0