【问题标题】:Rails: Combining last name and first name in Rails modelRails:在Rails模型中结合姓氏和名字
【发布时间】:2011-04-27 12:59:58
【问题描述】:

最终解决方案:

我有一个使用 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>

我需要将名字和姓氏大写,并在名为“登录”的数据库字段中的用户模型中将它们组合起来(例如姓氏、名字)。这是完整的用户模型:

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

谢谢。

【问题讨论】:

  • 连接字符串的语法应该是:self.login = "#{last_name}, #{first_name}"
  • tks @a3uge 和 @JeffPaquette。我不断收到的错误是“nil:NilClass 的未定义方法‘大写’”
  • 别忘了我们这些双姓氏。我的是伯恩-默多克而不是伯恩-默多克。这同样适用于 O'Leary、McDonald 等。
  • 嘿,@Colin。如果有一个简单的解决方案,你能告诉我。在这一点上,我不能花时间写一个长的解决方案来解决这个问题。谢谢你的想法。我会做一个笔记,以便稍后在此应用程序的开发中回到这一点。
  • 真的没有简单的解决方案。就我个人而言,我假设用户已经在案例中输入了他们应该写的名字,并且根本没有改变它们。我想捕获全小写的名称是合理的,然后对它们使用大写。这会将“mcdonald”变成“Mcdonald”,但不会影响“McDonald”。

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


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢。 rake db:migration 在数据库中生成了 first_name 和 last_name 列。验证结果为“名字不能为空”和“姓氏不能为空”。有趣的是,在股票 Devise 模型之外创建的字段是不会通过验证的字段。
  • 感谢@mharper。我在这里添加了一个专门讨论验证问题的单独帖子:stackoverflow.com/questions/5806048/…
【解决方案2】:
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

【讨论】:

  • 谢谢@fl00r。 last.name 应该是 last_name?我收到以下错误:nil:NilClass 的未定义方法“大写”
  • tks 再次@fl00r。仍然为 nil:NilClass 获得未定义的方法 `capitalize'
  • @fl00r 整个模型如上图所示。我注释掉了验证,因为我得到“属性名称必须是符号”。我一次想出一个问题。在没有验证的情况下,我仍然得到“nil:NilClass 的未定义方法 `capitalize'”。
  • 以另一种方式添加验证(每个属性分开 - 答案已更新)。对于undef method capitalized... 使用compact 方法:login = [last_name, first_name].compact.map(&amp;:capitalize).join(", ")
  • @fl00r 我更改了验证,所以它不是一个数组,现在它可以工作了。出于某种原因,名字和姓氏返回为空白。
猜你喜欢
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多