创建名称助手,将名字和姓氏分开

try*_*000 7 ruby-on-rails ruby-on-rails-3

我正在寻找一些关于如何获取属性并通过方法处理它以返回不同内容的帮助.但我以前从未这样做过,我不确定从哪里开始.我想改变一个名字:字符串属性从"乔治华盛顿"或"约翰昆西亚当斯"变成名字只有"乔治"和"约翰".

我想也许一个帮助方法是最好的,比如

users_helper.rb

def first_name

end
Run Code Online (Sandbox Code Playgroud)

然后调用@ user.name.first_name,这最初是如何工作的?有人可以解释我下一步可以将@ user.name传递给方法吗?我见过这样的事情,但不太明白括号......

def first_name(name)
  puts name
end
Run Code Online (Sandbox Code Playgroud)

有人可能会破坏rails/ruby​​这类东西吗?非常感谢!

Nic*_*lis 14

有些人有两个以上的名字,比如"John Clark Smith".您可以选择将它们视为:

(1)first_name:"John",last_name:"Smith"

  def first_name
    if name.split.count > 1
      name.split.first
    else
      name
    end
  end

  def last_name
    if name.split.count > 1
      name.split.last
    end
  end
Run Code Online (Sandbox Code Playgroud)

(2)first_name:"John Clark",last_name:"Smith"

  def first_name
    if name.split.count > 1
      name.split[0..-2].join(' ')
    else
      name
    end
  end

  def last_name
    if name.split.count > 1
      name.split.last
    end
  end
Run Code Online (Sandbox Code Playgroud)

(3)first_name:"John",last_name:"Clark Smith"

  def first_name
    name.split.first
  end

  def last_name
    if name.split.count > 1
      name.split[1..-1].join(' ')
    end
  end
Run Code Online (Sandbox Code Playgroud)

上面的例子假设如果名称包含少于2个单词,那么它就是名字.


Dav*_*ton 6

括号(可选)括起参数列表.

def first_name(full_name)
  full_name.split(" ")[0]
end
Run Code Online (Sandbox Code Playgroud)

这假设参数不是nil.

> puts first_name "Jimmy McKickems"
Jimmy
> puts first_name "Jeezy"
Jeezy
Run Code Online (Sandbox Code Playgroud)

但这不是一个字符串方法,因为你现在假设:

@user.full_name.first_name # Bzzt.
Run Code Online (Sandbox Code Playgroud)

代替:

first_name @user.name
Run Code Online (Sandbox Code Playgroud)

这可以包含在模型类本身中:

class User < ActiveRecord
  # Extra stuff elided

  def first_name
    self.full_name.blank? ? "" : self.full_name.split(" ")[0]
  end
end
Run Code Online (Sandbox Code Playgroud)

额外的代码检查名称是否为空或空格(blank?来自Rails).如果是,则返回空字符串.如果不是,则将其拆分为空格并返回结果数组中的第一项.


Eri*_*son 5

如果您只希望拆分一次并提供两个部件,则此衬管可以使用:

last_name, first_name = *name.reverse.split(/\s+/, 2).collect(&:reverse)
Run Code Online (Sandbox Code Playgroud)

以姓氏为姓,以其他所有名字为姓。因此,如果有前缀“ Dr.”或中间名将包含在名字中。显然,对于带有单独单词“ Charles de Gaulle”的姓氏,它将不起作用,但处理起来会更加困难(如果不是不可能的话)。