Rails плагин для группы пользователей - PullRequest
0 голосов
/ 21 мая 2010

Приложение My Rails имеет модель пользователя и модель группы, где пользователь принадлежит группе.Благодаря этому пользователь может быть администратором, менеджером, подписчиком и т.д.обычная учетная запись, а затем администратор устанавливает атрибут новой обычной учетной записи group_id в качестве идентификатора группы администратора ... используя некоторое условие в моем пользовательском контроллереНо это не очень чисто, я думаю.Потому что для безопасности мне нужно добавить такой код в (например) User # update:

class UsersController < ApplicationController
  # ...
  def update
    @user = User.find(params[:id])
    # I need to add some lines here, just as on the bottom of the post.
    # I think it's ugly... in my controller. But I can not put this
    # control in the model, because of current_user is not accessible
    # into User model, I think.
    if @user.update_attributes(params[:user])
      flash[:notice] = "yea"
      redirect_to root_path
    else
      render :action => 'edit'
    end
  end
  # ...
end

Есть ли чистый способ сделать это с помощью плагина Rails?Или без ...

По более чисто , я думаю, было бы лучше, если бы эти строки из обновления # пользователя:

if current_user.try(:group).try(:level).to_i > @user.try(:group).try(:level).to_i
  if Group.exists?(params[:user][:group_id].to_i)
    if Group.find(params[:user][:group_id].to_i).level < current_user.group.level
      @user.group.id = params[:user][:group_id]
    end
  end
end

... были удалены изконтроллер и приложение смогли установить группу, только если уровень группы текущего пользователя лучше, чем отредактированный пользователь.Но, возможно, я ошибаюсь, возможно, мой код еще совершенен:)

Примечание: в моей модели User есть этот код:

class User < ActiveRecord::Base
  belongs_to :group
  attr_readonly :group_id
  before_create :first_user
  private
  def first_user
    self.group_id = Group.all.max {|a,b| a.level <=> b.level }.id unless User.exists?
  end
end

Как вы думаете, это хороший способ?Или вы обрабатываете по-другому?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 мая 2010

Я предпочитаю методы контроллера быть скудными и маленькими, и помещать фактическую логику модели в вашу модель (где она принадлежит).

В вашем контроллере я бы написал что-то вроде

def update
  @user = User.find(params[:id]
  if @user.can_be_updated_by? current_user
    @user.set_group params[:user][:group_id], current_user.group.level
  end
  # remove group_id from hash
  params[:user].remove_key(:group_id)
  if @user.update_attributes(params[:user])
     ... as before
end

и в вашей модели у вас будет

def can_be_updated_by? (other_user)
  other_user.try(:group).try(:level).to_i > self.try(:group).try(:level).to_i
end

def set_group(group_id, allowed_level)
  group = Group.find(group_id.to_i)
  self.group = group if group.present? && group.level < allowed_level
end

Это помогает?

0 голосов
/ 21 мая 2010

Что ж, если у вас есть модель Пользователь / Группы (или Пользователь / Роли), другого пути нет, кроме того, который вы подчеркнули.

Если это ассоциация ne-to-many, вы можете выбрать сохранение группы пользователей в виде строки, а если это ассоциация многие-ко-многим, вы можете использовать битовую маску , но, тем не менее, либо через бизнес-логику или выбор администратора вам нужно установить отношение пользователь / группа.

У вас может быть несколько вариантов установки этих отношений в представлении.

Чтобы расширить возможности вашей модели, я советую вам использовать CanCan , очень хороший драгоценный камень авторизации, который позволяет очень просто разрешить мелкозернистый доступ к каждому ресурсу в вашем приложении rails.

...