2011-01-08 18 views
5

appointmentというモデルがあります。それぞれappointmentstylistです。この作品レールの関連付けとフォーム

<div class="field"> 
    <%= f.label :stylist_id %><br /> 
    <%= f.select(:stylist_id, Stylist.order("name").map { |s| [s.name, s.id] }) %> 
    </div> 

が、私のアプリ内のすべての関連付けのためにこの種のものを行うには面倒なことになるだろう:私は新しいappointmentを作成する形で、私はこれをやっています。 Railsには関連付けのための選択フィールドを自動的に生成するいくつかの方法があると思いますが、どのように動作するかわかりません。そんなことがあるの?

ああ、そして、私はすでに足場について知っています。足場が私が上で説明したものの世話をすることになっているなら、私はそれが私のためにやっていないので、間違ったことをしているようです。

(私はRailsの3によ)私の知る限りは、Railsが選択タグを作成する簡単な方法を持っていない知っているよう

+0

うーん...あなたは今までFormtasticまたは任意の外部のフォーム宝石を使用して考えがありますか? – Rekin

+0

あなたはおそらくそのような動作のためにFormtasticをチェックアウトするべきです。 https://github.com/justinfrench/formtastic –

答えて

23

うーん、collection_selectは、一般的なシナリオのために働くだろうと思わ:

<%= f.collection_select :stylist_id, Stylist.all, :id, :name %> 
1

。 formtastic(https://github.com/justinfrench/formtastic)やsimple_form(https://github.com/plataformatec/simple_form)のような宝石を使うと、フォームを簡単に作成できます。私は自分自身simple_formを好むので、私はそれを試してみることを勧めます。

別の方法は、データベースから関連レコードを自動的に取得する独自の選択ヘルパーを作成することです。また、モデルの内側Stylist.order...のものを置くことができます:

# Model 
def self.select 
    Stylist.order("name").map { |s| [s.name, s.id] } 
end 

# Form 
<%= f.select(:stylist_id, Stylist.select) %> 

は、あなたのビューが少し見やすくします。今

# config/initializers/to_options.rb 
module ActiveRecord 
    class Base 
    def self.to_options(title=:name) 
     self.all.map{|r| [r.send(title), r.id]} 
    end 
    end 
end 

、あなたが任意のモデルにto_optionsを使用することができます。RobinBrouwerの答えが正しいと、私はちょうど私が仕事で私たちのアプリケーションのいずれかのために思い付いた小さなナゲットを共有したいと思った:)

4

同じくらいオプションテキスト(任意のフィールドはデフォルトでname)を選択する柔軟性を備えています。

Model.to_options # => Creates select options with [m.name, m.id] 
AnotherModel.to_options(:title) # => Creates select options with [m.title, m.id] 

必要に応じて発注を変更する必要はありません。

+0

確かにいい方法です。ありがとう! :) – RobinBrouwer

関連する問題