Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby On Rails > acl9. Как расширить поля?


Автор: dEEp 30.3.2010, 18:13
Использую acl9. Необходимо при регистрации пользователя использовать не только дефолтные поля, но и свои. 

форма содержит поля: имя, пароль, подтверждение и ящик. но я добавил ещё и тип пользователя.  Почему у меня тогда при сохранении в type - лежит null?


миграция выглядит так: 

Код

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.column :login, :string, :null => false
      t.column :email, :string, :null => false
      t.column :type, :string, :null => false
      t.column :crypted_password, :string, :null => false
      t.column :password_salt, :string, :null => false
      t.column :persistence_token, :string, :null => false
      t.column :single_access_token, :string, :null => false
      t.column :perishable_token, :string, :null => false

      t.column :login_count, :integer, :null => false, :default => 0
      t.column :failed_login_count, :integer, :null => false, :default => 0
      t.column :last_request_at, :timestamp
      t.column :current_login_at, :timestamp
      t.column :last_login_at, :timestamp
      t.column :current_login_ip, :string
      t.column :last_login_ip, :string

    end
  end

  def self.down
    drop_table :users
  end
end


В контроллере ничего интересного:
Код

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

    if @user.save
      flash[:notice] = "Account registered!"
      redirect_back_or_default account_url
    else
      render :action => :new
    end
  end



ну и модель:
Код

class User < ActiveRecord::Base
  acts_as_authentic
end

Автор: shine 30.3.2010, 19:32
type - это волшебное название поля в таблице для Rails. Сам фреймворк использует его в своем механизме STI. Поэтому переименуй поле и полегчает. Кстати, можешь посмтореть на STI: может это именно то, что ты пытаешься реализовать.

Автор: dEEp 30.3.2010, 20:53
Переименование помогло. Спасибо.

Добавлено через 3 минуты
я не знаю что такое STI, то почитаю. 

а пытаюсь организовать различные типы пользователей. т.е. для разных типов пользователей разные формы регистрации

Автор: рельсовик 3.4.2010, 10:54
Цитата(dEEp @ 30.3.2010,  20:53)
Переименование помогло. Спасибо.

Добавлено @ 20:56
я не знаю что такое STI, то почитаю. 

а пытаюсь организовать различные типы пользователей. т.е. для разных типов пользователей разные формы регистрации

В таком случае, тебе возможно STI с type и надо, но нет ничего старшного в использовании null для обозначения "абстрактного" или "обычного" пользователя.

STI работает так: к примеру ты хочешь реализовать обычных пользователей и админов. Делаешь модель User и соответствующую миграцию с полем type, который будет nullом.

Затем есть два варианта, в завимимости от требований:

1. Пишешь все нужные методы для обычного юзера в модели User. Затем делаешь модель AdminUser < User, и дописываешь нужный функционал в эту модель. Хинт: если назовешь два метода в User и AdminUser одинакого, то метод будет исполнятся тот, что в модели юзера, на котором он исполнятся. В миграции ничего не трогаешь. А затем можно создавать новых админов путем u = AdminUser.new, или же u = User.new; u.type = AdminUser; (последний метод годится для изменений существующих юзеров). В обоих случаях админы будут сохранятся в ту же таблицу users, но с типом = AdminUser. Вот и вся магия =)

2. Оставляешь юзера абстрактным и пишешь туда только те атрибуты и методы, которые одинаковые для всех юзеров. Создаешь две модели: RegularUser и AdminUser, и пишешь везде свои методы. А дальше - как в варианте 1. Вариант 2 предпочтительней когда разных юзеров много, или же есть юзеры у которых меньше прав чем у "обычных" юзеров (GuestUser, например), поскольку безопасность всегда лучше внедрять путем давания прав по необходимости, а не лишения их.

Автор: dEEp 3.4.2010, 17:52
понял. спасибо. надо подумать, подходит ли мне это.

Добавлено через 1 минуту и 4 секунды
дайте пожалуйста обоим ребятам плюсы, а то я не могу, а они заслужили.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)