У меня есть приложение Rails с аутентификацией пользователя с использованием Devise.Я строю админ-панель с нуля (без RailsAdmin или ActiveAdmin).Я могу отображать и показывать данные пользователей в моей админ-панели.Но я не могу создать нового или редактировать пользователей.Я написал свою собственную логику в отдельном контроллере (выделенном для панели администратора).Как я уже сказал, действия показывают и уничтожают отлично, но не создают и обновляют.
Я полагаю, это потому, что пользователи создаются с помощью Devise.Я ищу способ переопределить контроллеры Devise для действий в панели администратора.
routes.rb
:
Rails.application.routes.draw do
devise_for :users
resources :users
namespace :admin do
get '', to: 'dashboard#index', as: '/'
resources :users
resources :products
end
...
end
app/controllers/admin/users_controller.rb
class Admin::UsersController < ApplicationController
def index
@users = User.all.order('CREATED_AT DESC')
end
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
redirect_to admin_path
flash[:notice] = "Le client a bien été créé"
else
redirect_to new_admin_user_url
flash[:alert] = "Une erreur est survenue lors de la création du client. Veuillez réessayer"
end
end
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(params[:id])
@user.update_attributes(user_params)
if @user.save
redirect_to admin_path
flash[:notice] = "L'utilisateur #{@user.firstname} #{@user.lastname} a bien été modifié"
else
redirect_to edit_admin_user_path(@user)
flash[:alert] = "Une erreur est survenue lors de la modification de l'utilisateur. Veuillez réessayer"
end
end
def destroy
@user = User.find(params[:id])
if @user.destroy
redirect_to admin_path
flash[:notice] = "L'utilistateur a bien été supprimé"
else
redirect_to admin_path
flash[:alert] = "Une erreur est survenue lors de la suppression de l'utilisateur. Veuillez réessayer"
end
end
private
def user_params
params.require(:user).permit(:firstname, :lastname, :birth_date, :phone_number, :email, :role)
end
end
user.rb
:
class User < ApplicationRecord
has_one :dashboard
enum role: [:user, :admin]
after_initialize :set_default_role, :if => :new_record?
def set_default_role
self.role ||= :user
end
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
validates_presence_of :firstname, :lastname, :birth_date, :email, :password, :password_confirmation
end
Вид редактирования, например: app/views/admin/users/edit.html.erb
<%= form_for @user, url: {action: "update"} do |f| %>
<%= f.text_field :firstname %>
<%= f.text_field :lastname %>
<%= f.date_field :birth_date %>
<%= f.text_field :email %>
<%= f.text_field :phone_number %>
<%= f.select(:role, User.roles.keys.map {|role| [role.titleize,role]}) %>
<%= f.submit 'Modifier le client', class: 'pdt-submit' %>
<% end %>
Вот что происходит на сервере rails:
Started PATCH "/admin/users/2" for ::1 at 2019-05-15 10:24:38 +0200
Processing by Admin::UsersController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"EeMpTRnwc/dHMI2sk/sJj4+F472yQ9G0IjpJB+o4gX3NDuBenXTsr+mJL/vJ+f09NnW0pASBIorcNTKgq7qEKw==", "user"=>{"firstname"=>"Justine", "lastname"=>"Dps", "birth_date"=>"1994-03-26", "email"=>"justine.dps26@gmail.com", "phone_number"=>"0768117148", "role"=>"admin"}, "commit"=>"Modifier le client", "id"=>"2"}
User Load (1.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 2], ["LIMIT", 1]]
↳ app/controllers/admin/users_controller.rb:38
(0.5ms) BEGIN
↳ app/controllers/admin/users_controller.rb:39
(41.3ms) ROLLBACK
↳ app/controllers/admin/users_controller.rb:39
(0.2ms) BEGIN
↳ app/controllers/admin/users_controller.rb:41
(0.5ms) ROLLBACK
↳ app/controllers/admin/users_controller.rb:41
Redirected to http://localhost:8000/admin/users/2/edit
Completed 302 Found in 54ms (ActiveRecord: 43.5ms)
Длятеперь, когда я нажимаю кнопку отправки, происходит ошибка действия (в create
и update
), говоря, что произошла ошибка.
Каков наилучший способ заставить его работать?