うまくいけば、簡単な答えです。私はgem best_in_placeを使用していますが、うまく機能します。以下を使用してドロップダウンメニューを作成する方法を理解しようとしています:
:type => :select, :collection => []
私ができるようにしたいのは、ユーザー モデルから入力された名前のリストを渡すことです。
これを行う方法はありますか?collection_select と混在させることはできますか?
うまくいけば、簡単な答えです。私はgem best_in_placeを使用していますが、うまく機能します。以下を使用してドロップダウンメニューを作成する方法を理解しようとしています:
:type => :select, :collection => []
私ができるようにしたいのは、ユーザー モデルから入力された名前のリストを渡すことです。
これを行う方法はありますか?collection_select と混在させることはできますか?
:collection パラメーターは、キーと値のペアの配列を受け入れます。
[ [key, value], [key, value], [key, value], ... ]
キーはオプションの値で、値はオプションのテキストです。
ビューではなく、オプションのリストを生成するオブジェクトに対応するモデルでこの配列を生成することをお勧めします。
best_in_place を起動して実行しているように聞こえるので、プロジェクト表示ページの簡単な例を次に示します。この例では、best_in_place を使用して、特定のプロジェクトに割り当てられたユーザーを選択ボックスで変更します。
## CONTROLLER
# GET /projects/1
# GET /projects/1.xml
# GET /projects/1.json
def show
@project = Project.find(params[:id])
respond_to do |format|
format.html
format.xml { render :xml => @project.to_xml }
format.json { render :json => @project.as_json }
end
end
## MODELS
class User
has_many :projects
def self.list_user_options
User.select("id, name").map {|x| [x.id, x.name] }
end
end
class Project
belongs_to :user
end
## VIEW (e.g. show.html.erb)
## excerpt
<p>
<b>Assigned to:</b>
<%= best_in_place @project, :user_id, :type => :select, :collection => User::list_user_options %>
</p>
# note :user_id and not :user
メモリから、 best_in_placeのマスター バージョンは、値が変更されているかどうかにかかわらず、選択ボックスの ajax 要求を送信することに注意してください。
また、心に留めておくべきことがあります。best_in_place は、新しいレコードを作成するのではなく、既存のレコードを「その場で」編集するためのものです (そのために、新しいページの _form パーシャルで collection_select を使用します)。