我的表项目中有3列。 first_name,last_name和fullname。
<%= 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 %>
有人能指出我正确的方向吗?我是铁杆的新手所以请在尝试帮助时记住这一点。感谢。
更新
现在我已将此添加到我的项目模型中:
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 %>
当我点击提交时,我检查日志,照常将姓名和姓氏保存到表中,但全名为空。任何人都可以看到问题所在吗?
UPDATE2
查看:
<%= 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
答案 0 :(得分:7)
视图中的Ruby代码在加载表单时执行,到那时表单中没有内容(如果您创建新记录)。在javascript中编写类似的代码并将其映射到onchange
事件first_name
和last_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,那可能就行了
答案 1 :(得分:0)
我知道Tombart已经回答了这个问题,但这可以帮助其他人。
class Person
before_create do
self.fullname = "#{first_name} #{last_name}"
end
end
您可以在RailsGuides找到更多信息。