2011-06-21 11 views
4

これまでの2時間で、私はすべてのユーザーと一緒にコンボボックスを埋めようとしていました。私はコンボボックスですべてのファーストネームを取得することができましたが、コンボボックスにフルネームが必要です。考えても問題ありません。名前を連結すれば完了です。 +と< <このthis.So行うには連結演算子が私のコードである必要があります:文字列連結はできませんか?

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

しかし、それはRoRのはこれを受け入れていないようだ:私は間違って

undefined method `+' for :user_firstname:Symbol 

何をしているのですか?

+1

'+'メッセージをクラス 'Symbol'のオブジェクトに送ります。そういうわけではないのです。 –

答えて

14

あなたがする必要があるのは、この連結を行うUserモデルのメソッドを定義することです。シンボルは連結できません。ユーザーモデルにして、この機能を追加します。

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

シンボルがちょうど整数、文字列、または日時のように、変数の型です(まあ、技術的に、彼らは授業をしているが、この文脈では、我々は、変数の型と考えることができます組み合わせることをしようとしています)。それらは文字列に似ており、それらと同様に機能することができますが、シンボル連結の動作の定義はありません。基本的には、2つのSymbolを連結するのと同じように非官能的なメソッドuser_firstnameuser_lastnameを送信しようとしています。

あなたが理解する必要があるのは、このパラメータがUserオブジェクトのメソッドを探しており、2つのシンボルの組み合わせを理解できないということです。あなたのモデルにメソッドを定義する必要があります。これはあなたのためのあなたの最初+最後の名前を返しますし、次にパラメータにあなたが(それは方法だから、それは各ユーザーに電話するよ:fullnameを送信する必要があります

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

コレクション内のオブジェクト):

また、すべての単一の列にテーブル名を接頭辞として付けるのは不適切です。 user.user_firstnameは冗長に見えます。私はそのプレフィックスを削除することを好むが、それは主に個人的な好みに依存すると思う。

0

valueおよびdisplay属性の引数は、メソッド名であり、ユーザーオブジェクトの式ではありません。

は、あなたの代わりに selectタグヘルパーを使用することができ、より正確なフォーマットを制御するには:

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

はかなり便利です。