最终解决方案:
我有一个使用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
感谢。
答案 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_name
和last_name
很好:所以我们会对其进行广告验证。同样最好验证长度并将其与一些正则表达式匹配。
然后,只要登录只创建一次,我们将添加before_create
回调,这将仅在对象创建(不更新)时执行。只有在传递验证时才会运行before_create
回调,因此如果first_name
或last_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表中?