2010-04-26 55 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