私は仕事をすることができないこの中央の状況を少し左に持っています. 最も簡単な言葉で言えば、has_one/belongs_to アソシエーションを使用してこの選択を構築し、それが正常に入力され、送信時に有効な値を返しますが、送信が何らかの理由で失敗した場合 (たとえば、別の入力検証が失敗した場合)、フォームがエラーメッセージで再描画すると、選択は、選択されたものではなく、リストの最初の値にデフォルト設定されます...ここにいくつかのコンテキストがあります。
私は次の2つのモデルを持っています。1 つ目は、PHP アプリから継承したテーブルであり、"うまくプレイ" する必要があるため、Rails の規則に従っていません。
class Listing < ActiveRecord::Base
set_primary_key :lid
has_one :site
end
class Site < ActiveRecord::Base
belongs_to :listing
end
この従来のテーブルが主キーとして「id」ではなく「lid」を使用しているという事実をカバーするために、小さな輪をくぐり抜けなければならなかったことがわかります。
私の見解では、ActionView::Helpers::FormBuilder::select を使用してこのフォームを選択しています。
.field
.left.form-label
= f.label :listing
.left.form-field
= f.select( :listing_id, options_from_collection_for_select(Listing.all.sort {|a,b| a.address <=> b.address}, :lid, :address), :prompt => "Please select an address", { :selected => @site.listing_id })
送信を実行すると、他の無関係な理由でエラーが返されます。選択は、ユーザーが実際に選択したオプションではなく、リストの最初のオプションに設定されます。
他のいくつかのコンテキスト。最初に失敗する運命にあるセーブの着信パラメータは次のとおりです。
Parameters: {"utf8"=>"✓",
"authenticity_token"=>"X/yqRO0VA0/3GrkGT0sc2KVPd4sVLF2Nd/vnjQM7GOI=", "site"=>
{"domain"=>"butterballasshat.info", "listing_id"=>"937", "user_id"=>"21",
"description"=>"asdf"}, "commit"=>"Save"}
そして、ここに関連するコントローラーコードがあります:
def create
@site = Site.new(params[:site])
respond_to do |format|
if success and @site.save
format.html { redirect_to(sites_url, :notice => 'Site was successfully created.') }
format.xml { render :xml => sites_url, :status => :created, :location => @site }
else
format.html { render :action => "new" }
format.xml { render :xml => @site.errors, :status => :unprocessable_entity }
end
end
end
私の問題に頭を悩ませるために他の情報が必要な場合は、喜んで提供します...