0

一部のコントローラーコードを変更しようとしています。でも、どこに入れたらいいのかわからない。

新しいお問い合わせフォームに次のものがあります。

    <%= f.association :location, :label_method => :name, :label => 'Location:' %>

コードはロケーションのコントローラーでインデックス コードを実行すると想定しました。

しかし、ロケーション インデックスのすべてのコードを削除したところ、ロケーションに関連付けられた連絡先フォームにはまだデータが含まれています。

Contact 関連付け stmt で次のコードを実行したいのですが、どこに配置すればよいかわかりません。

@locations = Location.ordered_by_ancestry_and(:name).map { |l| ["  " * l.depth + l.name, l.id] }

更新1

これはdevelopment.logです

Processing by ContactsController#new as HTML
Location Load (0.2ms)  SELECT "locations".* FROM "locations" ORDER BY (case when locations.ancestry is null then 0 else 1 end), locations.ancestry, name

更新2

テストのために ContactsController#new を次のように変更しました。

 # GET /contacts/new
 # GET /contacts/new.json
 def new
   @locations = Location.first

そして、選択ボックスにすべての場所がまだあります。

4

1 に答える 1

0

SimpleFormForassociationヘルパー メソッドは、その関連付けのネストされた属性として機能するリスト (デフォルトでは選択リストですが、ラジオまたはチェックボックス リストに変更できます) を生成します。送信されると、このフィールドは親フォームと同じコントローラー アクション (この場合はContactsController#createアクション) に渡されます。

カスタマイズした場所のリストに関しては、これをcollectionオプションとしてassociationメソッドに渡すことができます。

<%= f.association :location, :collection => @locations, :label_method => :name, :label => 'Location:' %>

この@locationsリストを作成する実際の場所は、それにアクセスする必要がある可能性のある任意のアクションにあります。これには、 and だけでなく and も含まれます(エラーnewによりフォームの送信が妨げられた場合)。を使用して、重複を排除できます。editcreateupdatebefore_filter

コードは次のようになります。

class ContactsController < ApplicationController
  before_filter :load_locations, :only => [:new, :edit, :create, :update]

  #... actions go here

  private
  def load_locations
    @locations = Location.ordered_by_ancestry_and(:name).map do |l| 
      ["  " * l.depth + l.name, l.id]
    end
  end
end
于 2013-05-06T15:29:36.377 に答える