2010-04-26 62 views
3

我正在创建一个Ruby on Rails应用程序,并且正在尝试创建/登录/注销用户。在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 

是否有这样做的更优雅/有效的方法?

回答

8

PARAMS [:用户]只是一个哈希,你可以创建一个散列并与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 
+0

+1为是彻底!非常感谢。 – user5243421 2010-04-26 02:17:46