使用帐户和用户的应用程序 - 设计用户无法创建其他用户

时间:2012-02-02 19:56:43

标签: ruby-on-rails-3.1 devise

使用Rails 3.1.3和Devise 1.5.3。我的应用有帐户和用户。每个帐户可以拥有多个用户。用户可以拥有一个角色“user”或“account_admin”。将signup路由设计为accounts#new。帐户和初始account_admin用户同时创建。按照here描述的那样工作(尽管从那以后事情已经发展了一些)。

account_admin标志应该能够在该帐户中创建其他用户。这就是我遇到麻烦的地方:它不是创建新用户,而只是重定向到user_path(用户#show)页面,并显示消息“你已经登录了”。 (user_path是我被覆盖的after_sign_in_path。)

article提出了类似的问题。答案为管理员提供了一个单独的命名空间,但由于管理员是我常规应用程序的一部分,我认为不适用。

我已经定义了一个完整的UsersController。根据日志,GET "/users/new"从我的“UsersController #new”呈现。但是,POST "/users"被Devise拦截并从“Devise :: RegistrationsController #create”中呈现。

配置/ routes.rb中

devise_for :users
devise_scope :user do
  get "signup",   :to => "accounts#new"
  get "signin",   :to => "devise/sessions#new"
  get "signout",  :to => "devise/sessions#destroy"
end
resources :users
resources :accounts

应用程序/控制器/ users_controller.rb

class UsersController < ApplicationController
  before_filter :authenticate_user!
  load_and_authorize_resource # CanCan
  ...
  def new
    # CanCan:  @user = User.new
  end

  def create
    # CanCan:  @user = User.new(params[:user])
    @user.skip_confirmation! # confirm immediately--don't require email confirmation
    if @user.save
      flash[:success] = "User added and activated."
      redirect_to users_path # list of all users
    else
      render 'new'
    end
  end
  ...
end    

我已经尝试overriding the Devise controller,如果用户已经登录,我可以告诉它使用我的users#create操作。日志告诉我它正在使用我的控制器(“Registration by RegistrationsController#创建为HTML“),但它似乎没有执行其代码。我已经注释掉了我的自定义操作,只是留在了记录器行中,但我没有收到记录消息。尽管super被注释掉了,但行为并没有改变 - 它仍然会重定向为“你已经登录了。”

配置/ routes.rb中

devise_for :users, :controllers => {:registrations => "registrations"}

应用程序/控制器/ registrations_controller.rb

class RegistrationsController < Devise::RegistrationsController
  def new
    logger.info "Custom RegistrationsController:  new"
    super
  end

  def create
    logger.info "Custom RegistrationsController:  create"
#    super unless user_signed_in?
#    render "users#create"
  end

  def update
    super
  end
end 

我错过了什么?如何让account_admin用户创建其他用户?

2 个答案:

答案 0 :(得分:1)

主要问题是Devise正在拦截POST "/users"(以及其他一些路线)。找到此解决方法以允许我的Users控制器处理这些路由:更改devise_for以跳过注册,然后添加回Devise通常定义别名的路由:

<强>的routes.rb

devise_for :users, :skip => [:registrations]
devise_scope :user do
  get "signup",   :to => "accounts#new"
  get "signin",   :to => "devise/sessions#new"
  get "signout",  :to => "devise/sessions#destroy"
  get "cancel_user_registration", :to => "devise/registrations#cancel"
  post "user_registration",       :to => "users#create"
  get "new_user_registration",    :to => "accounts#new"
  get "edit_user_registration",   :to => "users#edit"
end
resources :users
resources :accounts

从未弄清楚为什么Devise控制器覆盖不起作用。

this thread上的用户指出了devise_invitable宝石,这可能是一个有趣的选择。

答案 1 :(得分:0)

这就是我最终使用我的设置(Devise绑定到我的用户模型 - 没有单独的编辑/管理模型)的方式:

class UsermakersController < ApplicationController
before_action :authenticate_user!

def new
    @user = User.new
end

def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        format.html { redirect_to users_path, notice: 'User was successfully created.' }
        format.json { render :show, status: :created, location: @user }
      else
        format.html { render users_path }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
end

private
    def user_params
      userParams = params.require(:user).permit(:name, :email)
    end
end

从这里开始,当您想要将新用户添加为另一个用户时,只需在表单中调用Usermakers#new url,例如,我在用户索引页的底部显示:

 <%= link_to 'Add User', new_usermaker_path, id: 'new_user_link' %>

用户制作者表格如下:

= simple_form_for @user, url: usermakers_path, html: {multipart: true} do |f|
=f.error_notification errors: true

= f.input :name
= f.input :email

%p
= f.button :submit, 'Create User', class: 'button'

当然,您需要添加一个虚拟的new.html.erb文件,该文件只是呈现_form.html.erb来使用它。

只需将新方法和创建方法添加到routes.rb文件(无论是resources :usermakers还是更具体的路线),您应该好好去。希望这有帮助!