Как иметь два «уровня доступа» для модели в Rails? - PullRequest
1 голос
/ 07 апреля 2011

Давайте предположим простой и распространенный сценарий.

У меня есть модель User с полем admin.Пользователи не могут редактировать свое поле admin, но администраторы могут редактировать чье-либо поле admin.

Итак, мне нужно предоставить доступ обоим типам пользователей.

Если бы я представил этоRESTful, у меня было бы два ресурса, скажем

resource :user
namespace :admin do
  resources :users
end

... И тут возникает дилемма - как мне контролировать, где поле admin можно изменить, а где нет?

  1. Я могу установить attr_protected :admin, чтобы пользователи не могли изменять свой статус администратора.Но тогда мне придется сделать из этого особый случай в Admin::UsersController, например

    @user.admin = params[:user][:admin]
    
  2. Я могу отсканировать параметр в UsersController, что еще хуже

    params[:user].delete(:admin)
    

Оба эти решения кажутся мне грязными.Как правильно справляться с такими ситуациями?

Что, если имеется более двух уровней доступа?

Ответы [ 3 ]

2 голосов
/ 07 апреля 2011

как насчет подклассов? может быть попробовать что-то вроде этого:

class User < ActiveRecord::Base
    attr_accessible :columns, :that, :are, :safe, :for, :users
end

class AdminUser < User
    attr_accessible :admin
end

затем используйте соответствующую модель в каждом контроллере. обратите внимание, что использование attr_protected в классе User не будет работать в этом сценарии, так как AR (в настоящее время) не применяет их интеллектуально, он будет жаловаться, что: admin может быть только в одном. использование attr_accessible, как правило, лучше, в любом случае.

1 голос
/ 07 апреля 2011

Подумайте о переработке ваших ресурсов, чтобы они выглядели примерно так:

users/guest
users/user
users/admin

, где

admin<user 

и

user<guest

Опираясь на отличный ответ Джона, вы можете попробовать что-то вроде следующего:

class Guest < ActiveRecord::Base
  attr_accessible :columns, :that, :are, :safe, :for, :guests
  attr_reader :is_admin
end

class User < Guest
  attr_accessible :more, :stuff, :for, :users
end

class AdminUser < User
  attr_accessible :some, :adminThings, :here
  attr_writer :is_admin
end

... и тогда AdminUser унаследует attr_read для: is_admin от гостя.

Надеюсь, это поможет -

Perry

0 голосов
/ 25 мая 2011

Похоже, что в Rails 3.1 будет именно то, что я хотел.

http://ablogaboutcode.com/2011/05/12/activerecord-3-1-mass-assignment-roles/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...