在Rails 3模型中组合姓氏和名字

时间:2011-04-27 12:59:58

标签: ruby-on-rails ruby-on-rails-3 model

最终解决方案:

我有一个使用Devise处理身份验证的Rails 3应用程序。在注册表单中,我有以下字段:

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

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

我需要对名字和名字进行大写,然后将它们组合在一个名为“login”的数据库字段中的User模型中(例如Lastname,Firstname)。这是完整的用户模型:

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

感谢。

2 个答案:

答案 0 :(得分: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_name之前不会执行回调并且last_name已填满。

<强> UPD

好的,只要你收到错误:

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

答案 1 :(得分:1)

我真诚地,诚实地,真正地鼓掌使用Ruby的强大功能,但由于这是两个字符串的直接和静态连接,我会选择:

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

对于nil:NilClass问题,您是否在关联的迁移中将first_name和last_name列添加到users表中?