2011-04-27 67 views
0

FINAL SOLUTION:在Rails 3模型中結合姓氏和名字

我有一個Rails 3應用程序,它使用Devise來處理身份驗證。在註冊表單我有以下字段:

<p><%= f.label :first_name %><br /> 
    <%= f.text_field :first_name %></p> 

    <p><%= f.label :last_name %><br /> 
    <%= f.text_field :last_name %></p> 

我需要利用姓和名,並在用戶模式中所謂的「登錄」(如姓氏,名字),數據庫字段將它們結合起來。以下是完整的用戶型號:

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    attr_accessible :first_name, :last_name, :email, :password, :password_confirmation, :remember_me, :login 

    validates :first_name, :last_name, :email, :password, :password_confirmation, :presence => true 

    before_create :create_login 

    def create_login 
    self.login = "#{last_name.capitalize}, #{first_name.capitalize}" 
    end 

end 

謝謝。

+0

連接字符串的語法應該是:self.login =「#{last_name},#{first_name}」 – a3uge 2011-04-27 13:08:49

+0

這是行不通的嗎? – 2011-04-27 13:09:01

+0

tks @ a3uge和@JeffPaquette。我一直得到的錯誤是「未定義的方法'大寫'零:NilClass」 – Jay 2011-04-27 13:36:17

回答

1

我真誠,誠實,真正讚揚你的Ruby的力量使用,但由於這是這樣的兩個字符串的簡單,靜態的級聯,我會跟去:

def create_login 
    login = "#{last_name.capitalize}, #{first_name.capitalize}" 
end 

至於nil:NilClass問題,要補充您的用戶表中的first_name和last_name列在您的關聯遷移中?

+0

謝謝。 rake db:在數據庫中生成first_name和last_name列的遷移。驗證結果爲「名字不能爲空」和「姓氏不能爲空」。有趣的是,在股票Devise模型之外創建的字段是不會通過驗證的字段。 – Jay 2011-04-27 14:29:51

+0

thks @mharper。我添加了一個單獨的帖子,專門討論驗證問題:http://stackoverflow.com/questions/5806048/devise-additional-columns-to-user-model-not-validating – Jay 2011-04-27 14:52:40

1
before_create :create_login 
validates :first_name, :presence => true 
validates :last_name, :presence => true 

def create_login 
    login = [last_name, first_name].map(&:capitalize).join(", ") 
end 

簡短說明

我覺得這是很好的得到first_namelast_name註冊:所以我們將廣告驗證它。此外,驗證長度並將其與一些正則表達式匹配是個好主意。

然後,只要創建一次登錄,我們將添加before_create回調,只有當對象正在創建(而不是更新)時纔會執行回調。 before_create回調將僅在驗證通過時運行,因此如果first_namelast_name爲空 - 將不會傳遞驗證,並且在填充first_namelast_name之前不會執行回調。

UPD

好了,只要你讓你的錯誤:

def create_login 
    login = [last_name, first_name].compact.map(&:capitalize).join(", ") 
end 
+0

謝謝@ fl00r。 last.name應該是last_name?我收到以下錯誤:未定義的方法'大寫'爲零:NilClass – Jay 2011-04-27 13:15:05

+0

看到我的更新。 – fl00r 2011-04-27 13:18:04

+0

tks again @ fl00r。仍然得到未定義的方法'大寫'爲零:NilClass – Jay 2011-04-27 13:33:33

相關問題