在Rails中初始化“新用户”

时间:2010-04-26 01:57:53

标签: ruby-on-rails

我正在创建一个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_askedreputation等)由应用程序设置,因此应在创建新用户时初始化。现在,我只是在create UsersController方法中手动设置每个 def create @user = User.new(params[:user]) @user.reputation = 0 @user.questions_asked = 0 @user.answers_given = 0 @user.request = nil ... end

{{1}}

有更优雅/更有效的方法吗?

2 个答案:

答案 0 :(得分:8)

params [:user]只是一个哈希,你可以创建一个哈希并将其与params合并,如

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

答案 1 :(得分:0)