2

我的表项目中有 3 列。名字、姓氏和全名。

<%= f.hidden_field :first_name, :value => current_user.firstname %>
<%= f.hidden_field :last_name, :value => current_user.lastname %>

在用户保存项目的那一刻,用户的名字和姓氏被保存到不同的列中。我现在希望将名字和姓氏都保存到列全名中,以便以后搜索它们。

所以如果名字是

first_name = "Joe"
last_name = "Bloggs"

我怎么得到

fullname =  "Joe Bloggs"

我试过这个,但它不起作用。

<%=f.hidden_field :fullname, :value => :first_name + :last_name %>

有人可以指出我正确的方向吗?我是 Rails 新手,所以在尝试提供帮助时请记住这一点。谢谢。

更新

现在我已将其添加到我的项目模型中:

def set_fullname
    fullname = first_name + last_name
  end

在我看来,我现在称之为:

<%= f.hidden_field :first_name, :value => current_user.firstname %>
<%= f.hidden_field :last_name, :value => current_user.lastname %>
<%= f.hidden_field :fullname, :value => @project.fullname %>

当我点击提交时,我检查日志,名字和姓氏像往常一样保存到表中,但全名是空白的。任何人都可以看到问题是什么?

更新2

看法:

<%= f.hidden_field :first_name, :value => current_user.firstname %>
<%= f.hidden_field :last_name, :value => current_user.lastname %>
<%= f.hidden_field :fullname, :value => @project.set_fullname %>

项目模型:

def set_fullname
    fullname = first_name + last_name
  end

当我尝试访问该页面时,我收到此错误。

undefined method `+' for nil:NilClass
4

2 回答 2

7

您视图中的 Ruby 代码在表单加载时执行,此时表单中没有内容(如果您创建新记录)。onchange在 javascript 中编写类似的代码并将其映射到事件first_namelast_name文本字段是有意义的。

或者您可以在模型的服务器端执行此操作,例如:

class Person

  before :save, :set_fullname

  def set_fullname
    fullname = "#{first_name} #{last_name}"
  end
end

before :save每次更新模型时都会执行

无论如何,更清洁的解决方案是调整您的搜索查询,这样您只需在数据库中复制信息。

在搜索时尝试这样的事情:

"first_name LIKE ? or last_name LIKE ? or concat(last_name, ', ', first_name) LIKE ?"

此 SQL 代码可能依赖于数据库,如果您使用的是 MySQL,则可能没问题

于 2012-10-05T09:58:12.780 回答
0

我知道 Tombart 已经回答了这个问题,但这可以帮助其他人。

class Person

  before_create do
    self.fullname = "#{first_name} #{last_name}"
  end
end

您可以在RailsGuides上找到更多信息。

于 2015-02-03T10:39:42.787 回答