Techioz Blog

Ruby On Rails 7 - 登録用のカスタムコントローラーを考案する

概要

Ruby on Rails アプリケーションに認証を含めようとしています。私は同じためにDevise gemを使用しています。以下がシナリオです。

目的: Devise Registrations コントローラーではなく、Employees コントローラーを使用して新しいユーザーを作成したいと考えています。

以下は私がやったことです:

従業員管理者

class EmployeesController < ApplicationController

  # GET /employees or /employees.json
  def index
   @employees = User.search_employee(params[:employeesearchfield])
  end

  # GET /employees/1 or /employees/1.json
  def show
   
   User.archive_employee(params[:id])
   @employee = User.find(params[:id])
   
  end

  # GET /employees/new
 ** def new
    @employee = User.new
  end
**
  def import 
    User.import(params[:file])
    redirect_to employees_url, notice: "Data imported."
  end

  def export
  @employees = User.all
  respond_to do |format|
     format.csv { send_data @employees.to_csv, filename: "employees-#{DateTime.now.strftime("%d%B%Y")}.csv"}
    end 
  end

  def delete_multiple
   @employees = User.find(params[:employee_ids])
   #Array objects can be deleted one by one only.
   @employees.each(&:destroy)
   redirect_to employees_url, notice: "Employee was successfully destroyed."
  end

  ** def create
    @employee = User.new(employee_params)
    if @employee.save
      redirect_to root_path, notice: "Please check your email for confirmation instructions."
    else
      render :new, status: :unprocessable_entity
    end
  end**

  private

  def employee_params
    params.require(:user).permit(:name, :department, :employedon, :manager, :appraisalrating, :ctc, :empcategory, :empnumber, :post, :DOB, :personalemail, :contact, :officelocation, :workstyle, :gender, :companyname, :workshift, :address, :socialstatus, :employeepermanentillness, :phstatus, :bpay, :lastrevision, :appraisalcomments, :sup1, :sup2, :sup3, :sup4, :skillcategory, :estatus, :role)
  end

 
end

Routes.rb ファイルで、登録コントローラーの Devise ルートを次のようにオーバーライドしました。

ルートファイル

devise_for :employees, controllers: { registrations: "employees/new" }

新しいユーザーフォーム

<div class = "container">


<%= form_with model: @employee, url: new_employee_path, method: :post do |f| %>
<div class = "container">
  
    <div class = "row">

        <p class="display-6">ACCOUNT INFORMATION</p>
                 <div class="form-group col-6">
                  <b>USERNAME:</b>
                 <%= f.email_field :email, placeholder: "Enter username", class: 'form-content form-content w-100 p-1' %>
                 </div>

                 <div class="form-group col-6">
                 <b>DEFAULT PASSWORD</b>
                 <%= f.password_field :password, placeholder: "Enter password (Minimum length: 6 characters)", class: 'form-content form-content w-100 p-1' %>
                 </div>
    </div>

質問: フォームを送信すると、ルーティング エラーが発生します。 「ActionController::RoutingError ([POST] “/employees/new” に一致するルートがありません):」

期待される結果: 新しいユーザーが作成されます。

試してみてください: Employee Controller が Devise::RegistrationsController から継承すべきかどうか混乱しています。試してみましたが、またエラーが発生してしまいました。この概念を理解できず、助けを求めたいと思いました。

解決策

コントローラーを宣言するときは、次のことを行うだけです。コントローラー内のアクションや名前空間内のコントローラーではなく、コントローラーを宣言します。

この行

Device_for :employees、controllers: { 登録数: “employees/new” }

コントローラーを探します:

app/controllers/employees/new_controller.rb

でも、あなたはそれを探しているわけではありませんよね?次のように行を変更する必要があります。

Device_for :employees、controllers: { 登録: “従業員” }

そして今あなたはターゲットにしています

app/controllers/employees_controller.rb