Skip to content

How to add User Accounts for users to administer their personal accounts

zlw edited this page Feb 22, 2012 · 5 revisions

Create Account resource

ActiveAdmin.register User, as: 'Account' do
  actions :edit, :update

  menu parent: 'Users'

  controller do
    def redirect_to_edit
      redirect_to edit_admin_account_path current_user
    end

    alias_method :index, :redirect_to_edit
    alias_method :show,  :redirect_to_edit
  end

  form do |f|
    f.inputs do
      f.input :email
      f.input :password
      f.input :password_confirmation
    end

    f.buttons
  end
end

And created some tests (RSpec)

# /spec/controllers/admin/accounts_spec.rb
require 'spec_helper'

describe Admin::AccountsController do
  let(:user) { mock_model(User) }

  before do
    controller.should_receive(:current_user).and_return user
    controller.should_receive(:authenticate_user!).and_return true
  end

  context '#index & #show' do
    after do
      response.should redirect_to action: :edit, id: user.id
    end

    it 'should redirect to #edit' do
      get :index
    end

    it 'should redirect to #edit' do
      get :show, id: user.id
    end
  end
end
# /spec/requests/admin/accounts_spec.rb
require 'spec_helper'

describe 'Admin::AcccountsController' do
  let(:user) { Factory :user }
  before { sign_in user }

  it 'should edit users account and force user to sign in with new credentials' do
    visit edit_admin_account_path user

    new_email, new_password = '[email protected]', 'password'

    within 'form#edit_account' do
      fill_in 'account_email', with: new_email
      fill_in 'account_password', with: new_password
      fill_in 'account_password_confirmation', with: new_password

      click_button 'Update User'
    end

    current_path.should == new_user_session_path

    within 'form#session_new' do
      fill_in 'user_email', with: new_email
      fill_in 'user_password', with: new_password

      click_button 'Login'
    end

    current_path.should == edit_admin_account_path(user)
  end
end
# /spec/support/devise.rb
RSpec.configure do |config|
  config.include Warden::Test::Helpers

  config.before(:all) do
    Warden.test_mode!
  end

  config.after(:all) do
    Warden.test_reset!
  end
end

def sign_in(user)
  login_as user
end