2011-04-27 66 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

相关问题