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