Как назначить обычного пользователя суперпользователем или администратором - PullRequest
0 голосов
/ 09 апреля 2011

Я следовал учебнику по http://www.logansbailey.com/ и изменил его, чтобы незарегистрированный человек мог зарегистрироваться с именем пользователя, электронной почтой и паролем.
Я уже включил вошедшего в систему пользователя, чтобы изменить его / ее адрес электронной почты и пароль, но не имя пользователя.

Что я хочу добавить:

1) чтобы вошедший в систему пользователь мог видеть / достигать его / ее имени пользователя и электронной почты,
2) включить пользователя с установленным admin_flag (я обработал это в таблице sql и создал пользователя), чтобы иметь возможность просматривать / изменять все записи пользователя.

Я изменил app / cotrollers / user_controller.rb следующим образом:

class UsersController < ApplicationController

  before_filter :is_user, :only => [:index, :show, :edit, :update, :destroy]

  def index
    @users = User.all

    respond_to do |format|
      format.html # index.html.erb
      format.xml { render :xml => @users }
    end
  end

  def show
    @user = User.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml { render :xml => @user }
    end
  end

  def new
    @user = User.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml { render :xml => @user }
    end
  end

  def edit
  end

  def create
    @user = User.new(params[:user])

    respond_to do |format|
      if @user.save
        flash[:notice] = 'Registration successful.'
        format.html { redirect_to(:controller => 'home', :action => 'tutorial') }
        format.xml { render :xml => @user, :status => :created, :location => @user }
      else
        format.html { render :action => "new" }
        format.xml { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end

  def update

    respond_to do |format|
      if @user.update_attributes(params[:user])
        flash[:notice] = 'Your profile was successfully updated.'
        format.html { redirect_to(:controller => 'home', :action => 'index') }
        format.xml { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end

  def destroy
    @user = User.find(params[:id])
    @user.destroy

    respond_to do |format|
      format.html { redirect_to(users_url) }
      format.xml { head :ok }
    end
  end

  def is_user
    if User.exists?(params[:id])
      @user = User.find(params[:id]);
      if current_user.admin_flag == true
        flash[:notice] = 'Welcome Admin'
      end
      if !current_user || current_user.id != @user.id
        flash[:notice] = 'You do not have access to that page'
        redirect_to(:controller => 'home', :action => 'index')
      end
    else
      flash[:notice] = 'You do not have access to that page'
      redirect_to(:controller => 'home', :action => 'index')
    end
  end
end

Файл app / models / user.rb:

class User < ActiveRecord::Base
  acts_as_authentic
end

И я могу подтвердить, что пользователь admin_flag установлен правильно, поскольку файл app / views / layouts / application.html.erb содержит:

  <div id="admin">
    <% if current_user %>
      <% if current_user.admin_flag == true %> |
      <%= link_to "Users", users_path %>
      <% end %>
    <% end %>
  </div>

правильно отображает ссылку «Пользователи» при входе в систему с правами администратора.

Теперь проблема в том, что я не могу показать функциональность всем пользователям, редактировать других пользователей и т. Д. Как администратор, я могу показывать и изменять пользователя-администратора точно так же, как и все остальные обычные пользователи, то есть я тоже не могу изменять имя пользователя.

Что здесь может быть не так?

1 Ответ

0 голосов
/ 09 апреля 2011

Когда вы правильно добавили логический атрибут admin для пользователя, Rails должен добавить метод вопросительного знака admin?в модели пользователя.Это не важно, но для удобства.Для каждого метода, который вы хотите защитить от нежелательных действий, используйте before_filter:

class UsersController < ApplicationController

  before_filter :admin_user,   :only => :destroy
  before_filter :correct_user, :only => [:edit, :update]

  def destroy
  end

  ...

  private

  def admin_user
    redirect_to(root_path) unless current_user.admin?
  end

  def correct_user
    @user = User.find(params[:id])
    redirect_to(root_path) unless current_user?(@user) || current_user.admin?
  end
end

В представлениях удобнее использовать current_user.admin?

<div id="admin">
  <% if current_user.admin? %>
    <%= link_to "Users", users_path %>
  <% end %>
</div>
...