Разработать в Rails 3.1.1 добавление пользователя-администратора с помощью seed? - PullRequest
2 голосов
/ 09 октября 2011

У меня есть пример приложения Rails 3.1.1, которое я настроил для управления учетными записями пользователей и т. Д.

Я выполнил следующие шаги, чтобы добавить атрибут admin в таблицу пользователей:

$ rails generate migration add_admin_to_user admin:boolean

Добавил следующее в мою миграцию:

class AddAdminToUser < ActiveRecord::Migration
  def self.up
    add_column :users, :admin, :boolean, :default => false
  end

  def self.down
    remove_column :users, :admin
  end
end

Затем я запустил миграцию db: migrate и добавил в файл макета следующее:

<% if current_user.admin? %>
  You are ADMIN.
<%end %>

Затем, чтобы добавитьПервый пользователь-администратор Я использовал следующий начальный файл:

puts 'SETTING UP DEFAULT USER LOGIN'
user = User.create! :name => 'Test User', :email => 'test@test.com', :password => 'password', :password_confirmation => 'password'
puts 'New user created: ' << user.name

Это сработало, поэтому я адаптировал его к полю администратора:

puts 'SETTING UP DEFAULT USER LOGIN'
user = User.create! :name => 'Test User', :email => 'test@test.com', :password => 'password', :password_confirmation => 'password', :admin => 'true'
puts 'New user created: ' << user.name

Вышеприведенный начальный файл работал, ноФлаг администратора не отображается.

Я что-то пропустил?

Обновление: модель / пользователь / rb

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

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

Ответы [ 2 ]

13 голосов
/ 06 апреля 2012

Не добавлять администратора в attr_accessible. Это может привести к серьезному нарушению безопасности. Злонамеренный пользователь может отправить запрос PUT следующим образом:

put /users/17?admin=1

, который предоставит пользователю с правами администратора 17 ID. Смысл attr_accessible в том, чтобы определить, какие атрибуты доступны для вашей модели. Этот, в частности, вероятно, не тот, который вам нужен.

Вместо этого я предлагаю вам создать своего примера пользователя с помощью файла rake. Поместите файл (user_data.rake) в lib / tasks с указанием следующего, и это должно сработать.

namespace :db do
  desc "Fill database with sample data"
  task populate: :environment do
    admin = User.create!(name: "Test User",
                 email: "test@test.com",
                 password: "password",
                 password_confirmation: "password")
    admin.toggle!(:admin)
  end
end

Это определяет задачу db: populate и должна быть всем, что вам нужно для создания вашего примера пользователя.

Уже выполнив db: migrate, просто запустите db: reset, db: populate.

Обратите внимание на admin.toggle !. Вот где происходит магия.

Метод переключения следует использовать с осторожностью, поскольку он обходит обратные вызовы и проверки, определенные вами для вашей модели. В случае, о котором я упоминал, поскольку вы используете его вручную из грабли, нет риска, что оно может быть использовано злонамеренно в массовом назначении. Вы можете найти больше информации о методе переключения здесь: http://apidock.com/rails/ActiveRecord/Base/toggle

3 голосов
/ 04 ноября 2012

Согласен, не добавляйте: admin к attr_accessible, этот совет был сумасшедшим. Что касается saneshark, зачем создавать задачу, когда это цель семени? Просто поместите переключатель в файл db / migrate / seeds.rb. В вашем начальном файле измените:

puts 'SETTING UP DEFAULT USER LOGIN'
user = User.create! :name => 'Test User', :email => 'test@test.com', :password => 'password', :password_confirmation => 'password', :admin => 'true'
puts 'New user created: ' << user.name

до:

puts 'SETTING UP DEFAULT USER LOGIN'
user = User.create! :name => 'Test User', :email => 'test@test.com', :password => 'password', :password_confirmation => 'password'
user.toggle!(:admin)
puts 'New user created: ' << user.name
...