2011-06-21 40 views
4

因此,在过去的2个小时里,我一直在试图与我的所有用户填充组合框。我设法在一个组合框中获得所有的名字,但是我想在组合框中使用他们的全名。没有问题,你会想,只是连接名称,你就完成了。 +和< <应该是连接符做this.So这是我的代码:字符串串联不可能吗?

<%= collection_select(:user, :user_id, @users, :user_id, :user_firstname + :user_lastname, {:prompt => false}) %> 

但似乎回报率不接受这一点:

undefined method `+' for :user_firstname:Symbol 

我在做什么错?

+1

您正在将'+'消息发送到类“Symbol”的对象。这就是为什么它不起作用。 –

回答

14

你需要做的是在用户模型上定义一个方法,为你做这个连接。符号不能连接。所以你的用户模型,添加此功能:

def name 
    "#{self.first_name} #{self.last_name}" 
end 

然后在视图中的代码改成这样:

<%= collection_select(:user, :user_id, @users, :user_id, :name, {:prompt => false}) %> 

应该做的伎俩。

4

这不是真正的轨道给你一个错误,它是红宝石。你试图符号:user_firstname:user_lastname

符号是一个变量类型,就像整数,字符串或日期时间(当然在技术上他们是类,但在这方面,我们可以把它们作为变量类型相结合)。它们看起来很像字符串,并且可以类似于它们,但是没有定义符号连接的行为。本质上你试图发送方法user_firstnameuser_lastname,这与试图连接两个符号一样非常不合理。

你需要明白的是,这个参数是找您的用户对象上的方法,也不会明白两个符号的组合。你需要在模型中定义的方法:

def fullname 
    [user_firstname, user_lastname].reject{|v| v.blank?}.join(" ") 
end 

这会为你回到你的第一个+姓,然后在参数,你应该送:fullname(因为这是方法,它会调用每个用户集合中的对象):

<%= collection_select(:user, :user_id, @users, :user_id, :fullname, {:prompt => false})%> 

此外,它被认为是不良的做法前面加上表名每一列。 user.user_firstname只是看起来多余。我宁愿放弃这个前缀,但我想这主要取决于个人偏好。

0

value和display属性的参数是方法名称,而不是用户对象上的表达式。

更精确地控制的格式,你可以使用select标签帮手,而不是:

select("user", "user_id", @users.each {|u| [ "#{u.first_name u.last_name}", u.user_id ] }) 

docs是非常有用的。