2011-06-21 41 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是非常有用的。