Wypróbuję Devise po raz pierwszy. Jedną z rzeczy, które chciałem zrobić, jest udostępnienie użytkownikom interfejsu administracyjnego do tworzenia, wyszukiwania i edytowania użytkowników. Tutaj mogłem się pomylić.

Stworzyłem klasę PeopleController, która dziedziczy po ApplicationController, która zawiera listę osób oraz udostępnia metody i widoki do tworzenia i aktualizowania użytkowników. Wszystko działa dobrze, z jednym wyjątkiem. Kiedy administrator aktualizuje swój rekord, sesja jest czyszczona i po zapisaniu musi się ponownie zalogować.

W tej aplikacji nie korzystam z modułu rejestrowalnego. Tylko administrator może tworzyć nowych użytkowników. Jaki jest właściwy sposób dostarczania narzędzi do zarządzania użytkownikami. Stworzenie własnego kontrolera wydaje się być błędną ścieżką.

Z góry dziękuje za twoją pomoc.

10
Tim Stephenson 14 czerwiec 2011, 02:55

2 odpowiedzi

Najlepsza odpowiedź

Dziękuję bardzo za pomoc. To jest w zasadzie dokładnie to, co robię. Odkryłem wskazówkę, która pomogła mi rozwiązać problem czyszczenia sesji użytkownika, gdy edytuje on swój własny rekord na tej wiki:

https://github.com/plaTaformatec/deevise/wiki/how-to:-allow-users-to-edit-Their-account-without-Provid-a-Password.

To jest linia, którą potrzebowałem:

sign_in resource_name, resource, :bypass => true

Ta metoda znajduje się w Devise::Controllers::Helpers, więc zrobiłem to w moim kontrolerze.

class PeopleController < ApplicationController
   include Devise::Controllers::Helpers

Następnie w mojej metodzie aktualizacji wywołuję ją tylko wtedy, gdy current_user.id jest równy identyfikatorowi, który jest edytowany:

def update
  @person = User.find(params[:id])
  if @person.update_attributes(params[:user])
    sign_in @person, :bypass => true if current_user.id == @person.id
    redirect_to  person_path(@person), :notice  => "Successfully updated user."
  else
    render :action => 'edit'
  end
end

Teraz, jeśli bieżący użytkownik edytuje swój własny rekord, sesja zostanie przywrócona po zapisaniu.

Jeszcze raz dziękuję za odpowiedzi.

9
Tim Stephenson 14 czerwiec 2011, 20:59

W ten sposób zarządzam użytkownikami w jednej z moich aplikacji. Mam tylko jedną klasę User wygenerowaną za pomocą

rails g devise User

Do której dodałem kolumnę role z tą migracją:

class AddRoleToUser < ActiveRecord::Migration
  def change
    add_column :users, :role, :string, :default => "client"
  end
end

I mój model User:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable, :lockable and :timeoutable
  devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me

  def admin?
    self.role == "admin"
  end
end

Następnie, aby utworzyć nowych użytkowników, wszystko, co musisz zrobić, to zapewnić niestandardową metodę w kontrolerze (może nawet podklasę Devise::RegistrationsController) w następujący sposób:

# some_controller.rb
def custom_create_user
  if current_user.admin?
    User.create(:email => params[:email], password => params[:password])
    redirect_to(some_path, :notice => 'sucessfully updated user.')
  else
    redirect_to(some_other_path, :notice => 'You are not authorized to do this.')
  end
end
7
David 14 czerwiec 2011, 05:24
Poleciłbym również być może skorzystanie z oddzielnego modelu „Ról”, aby użytkownik mógł mieć wiele ról, jeśli to konieczne. Prawdopodobnie wszystko też by ułatwiło. Następnie model łączenia, być może nazwany „UserRole”, który miałby user_id i role_id.
 – 
ardavis
14 czerwiec 2011, 05:55
To prawda, chociaż zazwyczaj używam can, gdy muszę zdefiniować wiele ról lub złożone uprawnienia.
 – 
David
14 czerwiec 2011, 07:16
3
Używam również CanCan, ale nadal używam oddzielnego modelu roli. Sprawdź tę niesamowitą stronę wiki, którą stworzył Ryan Bates: github.com/ryanb/cancan/ wiki/oddzielny model roli
 – 
ardavis
14 czerwiec 2011, 07:49