Инициализация "новых пользователей" в Rails - PullRequest
3 голосов
/ 26 апреля 2010

Я создаю приложение Ruby on Rails и пытаюсь создать / войти / выйти из системы.

Это схема для Users:

  create_table "users", :force => true do |t|
    t.string   "first_name"
    t.string   "last_name"
    t.text     "reputation"
    t.integer  "questions_asked"
    t.integer  "answers_given"
    t.string   "request"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "email_hash"
    t.string   "username"
    t.string   "hashed_password"
    t.string   "salt"
  end

Личная информация пользователя (имя пользователя, имя / фамилия, адрес электронной почты) заполняется через POST. Другие вещи, такие как questions_asked, reputation и т. Д., Устанавливаются приложением, поэтому их следует инициализировать при создании новых пользователей. Сейчас я просто устанавливаю каждый из них вручную в методе create для UsersController:

  def create
    @user = User.new(params[:user])
    @user.reputation = 0
    @user.questions_asked = 0
    @user.answers_given = 0
    @user.request = nil
    ...
  end

Есть ли более элегантный / эффективный способ сделать это?

Ответы [ 2 ]

8 голосов
/ 26 апреля 2010

params [: user] - это просто хеш, вы можете создать хеш и объединить его с такими параметрами, как

def create
    params[:user].merge(
        { 
            :reputation => 0,
            :questions_asked => 0,
            :answers_given => 0
            ...
        }
    )

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

Вы можете переместить это в свою модель, если хотите удалить этот код из вашего контроллера, и просто добавить фильтр after_create.

но на самом деле, если просто установить значение 0, установите значения по умолчанию в столбцах базы данных, и вам даже не придется обрабатывать это в вашем коде

  create_table "users", :force => true do |t|
    t.string   "first_name"
    t.string   "last_name"
    t.text     "reputation", :default => 0
    t.integer  "questions_asked", :default => 0
    t.integer  "answers_given", :default => 0
    t.string   "request"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "email_hash"
    t.string   "username"
    t.string   "hashed_password"
    t.string   "salt"
  end

Если вы не можете повторить миграцию, используйте change_column_default, как

class SetDefaultsOnUsers < ActiveRecord::Migration
  def self.up
     change_column_default "users", "reputation", 0
  end

  def self.down
     change_column_default "users", "reputation", default
  end
end
0 голосов
/ 26 апреля 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...