我有一个网站,可以通过两种方式创建用户帐户:新用户(注册)和管理员用户。由于在每种情况下创建的处理方式不同,我决定将逻辑拆分为两个独立的函数。我有一个有效的实现,但我对Rails很新,所以我不知道它是否健壮且安全。我正在寻找有关如何改进它的反馈。
users_controller.rb
before_action :signed_in_user, only: [:home, :edit, :update, :destroy]
before_action :correct_user, only: [:edit, :update]
before_action :admin_user, only: [:create_by_admin, :destroy]
.
.
.
def new
if !signed_in?
@user = User.new
@user.confirmation_code = User.new_confirmation_code
elsif signed_in? && current_user.admin?
@user = User.new
render 'new_by_admin' # basically a new.html.erb but with a dropdown for the admin setting
else
redirect_to root_url
end
end
def create
if signed_in?
redirect_to root_url
elsif signed_in? && current_user.admin?
create_by_admin
else
create_by_user
end
end
def create_by_user
@user = User.new(user_params)
if @user.save
UserMailer.confirmation_email(@user).deliver
flash[:success] = "Great! Now check your email for activation instructions."
redirect_to root_url
else
render 'new'
end
end
def create_by_admin
@user = User.new(admin_params)
if @user.save
@user.update_attributes(confirmed: true)
flash[:success] = "User for " + @user.name + " created."
redirect_to users_path
else
render 'new_by_admin'
end
end
.
.
.
private
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation)
end
def admin_params
params.require(:user).permit(:name, :email, :password, :password_confirmation, :admin)
end
基本上,所有创建请求都被路由到创建操作,并从那里发送到适当的方法(取决于请求用户是新用户还是作为管理员的现有用户)。这些方法之间的区别在于新用户收到电子邮件以在注册时激活他们的帐户,并且无法将自己设置为管理员,而管理员用户创建已经确认的帐户并可以将其设置为管理员。
这是一种愚蠢的方式吗?我应该创建一个处理所有管理请求的admin_controller吗?