Приложение с учетными записями и пользователями - разработчик не может создавать дополнительных пользователей - PullRequest
1 голос
/ 02 февраля 2012

Использование Rails 3.1.3 с Devise 1.5.3.Мое приложение имеет учетные записи и пользователей.Каждая учетная запись может иметь несколько пользователей.Пользователь может иметь одну роль: «пользователь» или «account_admin».Разработайте signup маршруты до accounts#new.Учетная запись и начальный пользователь account_admin создаются одновременно.Получилось так, как описано здесь (хотя с некоторых пор все изменилось).

Учетная запись account_admin должна иметь возможность создавать дополнительных пользователей в этой учетной записи.Вот где у меня проблемы: вместо создания новых пользователей он просто перенаправляет на страницу user_path (users # show) с сообщением «Вы уже вошли в систему».(user_path это мой переопределенный after_sign_in_path.)

Эта статья задает аналогичный вопрос.Ответ предполагает отдельное пространство имен для администраторов, но поскольку администраторы являются частью моего обычного приложения, я не думаю, что это применимо.

Я определил полный UsersController.Согласно журналу, GET "/users/new" отрисовывает из моего "UsersController # new".Однако POST "/users" перехватывается Devise и выводится из "Devise :: RegistrationsController # create".

config / rout.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

app / controllers / 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    

Я пытался переопределить контроллер Devise , думая, что могу сказать ему использовать мое действие users#create, если пользователь уже вошел в систему. В журнале сказано, что он использует мой контроллер(«Обработка с помощью RegistrationsController # create as HTML»), но он, похоже, не выполняет свой код.Я закомментировал свои пользовательские действия и просто оставил их в строках регистрации, но я не получаю сообщения регистрации.И несмотря на то, что super закомментировано, поведение не меняется - оно по-прежнему перенаправляет с «Вы уже вошли в систему».

config / rout.rb

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

app / controllers / 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 ]

1 голос
/ 09 февраля 2012

Основная проблема в том, что Devise перехватывал POST "/users" (и несколько других маршрутов).Нашел этот обходной путь, чтобы мой контроллер Users мог обрабатывать эти маршруты: измените devise_for, чтобы пропустить регистрацию, затем добавьте обратно в маршруты, для которых Devise обычно определяет псевдонимы:

rout.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.

Пользователь в этой теме указал на гем devise_invitable , которыйможет быть интересной альтернативой.

0 голосов
/ 29 октября 2015

Вот так я и начал работать с моими настройками (Devise привязан к моей модели User - без отдельной модели Editor / Admin):

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

С этого момента, когда вы хотите добавить нового пользователя в качестве другого пользователя, просто вызовите новый URL-адрес Usermakers в вашей форме, например, у меня есть это внизу моей страницы индекса пользователей:

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

И форма Usermakers выглядит так:

= 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, чтобы использовать это.

Просто добавьте методы new и create в свой файл rout.rb (по resources :usermakers или более конкретным маршрутам), и все будет хорошо. Надеюсь, это поможет!

...