1

私は仕事をすることができないこの中央の状況を少し左に持っています. 最も簡単な言葉で言えば、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

私の問題に頭を悩ませるために他の情報が必要な場合は、喜んで提供します...

4

2 に答える 2

2

要求通り:

エラーが表示されないと何が問題なのかわかりませんが、選択の問題を解決するには、選択したものを次の構造でoptions_from_collection_for_selectメソッドに追加します: options_from_collection_for_select(collection, value, label, selected_id)

于 2011-09-03T18:50:56.147 に答える