8

Formtastic を使用すると、単純な選択ができます。

= f.input :category, :as => :select, :include_blank => false, :collection => subcategories

ここでは、子供のカテゴリのみを表示します。親子関係にはacts_as_treeプラグインを使用しています。親カテゴリも表示したいと思います。

Formtastic で生成された選択は次のようになります。

<select name="favoritefood">
  <optgroup label="Dairy products">
    <option>Cheese</option>
    <option>Egg</option>
  </optgroup>
  <optgroup label="Vegetables">
    <option>Cabbage</option>
    <option>Lettuce</option>
    <option>Beans</option>
    <option>Onions</option>
  <option>Courgettes</option>
  </optgroup>
  ⋮
</select>

acts_as_tree機能を備えたモデルのFormtastic selectでグループ化を使用するには? 誰か知っていますか?

更新しました

私はこれがうまくいくはずだと考えました:

= f.input :category, :include_blank => false, :group_by => :parent

しかし、それはエラーではありません:

undefined local variable or method `object_class' for #<Formtastic::SemanticFormBuilder:0x87d3158>

Formtastic にバグがあるようです。formtastic.rb を調べたところ、 detect_group_associationメソッドで object_class が見つかりました。

  def detect_group_association(method, group_by)
    object_to_method_reflection = self.reflection_for(method)
    method_class = object_to_method_reflection.klass

    method_to_group_association = method_class.reflect_on_association(group_by)
    group_class = method_to_group_association.klass

    # This will return in the normal case
    return method.to_s.pluralize.to_sym if group_class.reflect_on_association(method.to_s.pluralize)

    # This is for belongs_to associations named differently than their class
    # form.input :parent, :group_by => :customer
    # eg. 
    # class Project
    #   belongs_to :parent, :class_name => 'Project', :foreign_key => 'parent_id'
    #   belongs_to :customer
    # end
    # class Customer
    #   has_many :projects
    # end
    group_method = method_class.to_s.underscore.pluralize.to_sym
    return group_method if group_class.reflect_on_association(group_method) # :projects

    # This is for has_many associations named differently than their class
    # eg. 
    # class Project
    #   belongs_to :parent, :class_name => 'Project', :foreign_key => 'parent_id'
    #   belongs_to :customer
    # end
    # class Customer
    #   has_many :tasks, :class_name => 'Project', :foreign_key => 'customer_id'
    # end
    possible_associations =  group_class.reflect_on_all_associations(:has_many).find_all{|assoc| assoc.klass == object_class}
    return possible_associations.first.name.to_sym if possible_associations.count == 1

    raise "Cannot infer group association for #{method} grouped by #{group_by}, there were #{possible_associations.empty? ? 'no' : possible_associations.size} possible associations. Please specify using :group_association"

  end

実際、このメソッドではobject_class が定義されておらず、formtastic.rb にはその名前のプライベート メソッドはありません。しかし、関連付けを明示的に定義するために:group_associationを使用できます。

- semantic_form_for ([:manager, @purchase_profile]) do |f|
  - f.inputs do
    = f.input :category, :include_blank => false, :group_by => :parent, :group_association => :children
  = f.buttons

しかし、私は別のエラーに遭遇しました:

undefined method `children' for nil:NilClass

私はActs_as_treeをオフにして、自分自身の自己参照関連を書いてみました。Acts_as_tree と同じ動作は次のようになります。

class Category < ActiveRecord::Base
  belongs_to :parent, :class_name => "Category", :foreign_key => "parent_id"
  has_many :children, :class_name => "Category", :foreign_key => "parent_id"
end

エラーは同じです。誰でも助けることができますか?

更新しました

次の小さなステップ。Formtastic を使用しないこのコードは正常に動作します。

= grouped_collection_select('', :category_id, top_categories, :children, :name, :id, :name, :include_blank => true)

ps: top_categories は、親カテゴリのコレクションを持つヘルパー メソッドです。

最後に、それを Formtastic 構文に変換します:)

4

3 に答える 3

1

ねえ、それで私はformtasticで特定の問題を解決しようとしていて、:find_optionsを使用してリストの作成に使用されるクエリを変更できることを発見しました。コードを見ると、:group_byを指定しない場合、値のリストは最終的にモデルオブジェクトのfind(:all)になります(formtastic.rbのfind_raw_collection_for_columnというメソッドで)。:allの後のパラメーターは、:find_optionsで指定されたパラメーターのセットです。したがって、find(* args)で通常使用する条件やその他のパラメーターを適用できます(http://ar.rubyonrails.org/classes/ActiveRecord/Base.html#M000333を参照)。個人的には、これをf.inputステートメントに追加しました。

:find_options => {:conditions => {:country_id => @ business.country?@ business.country.id:nil}}

これにより、クエリのselectステートメントを現在の郡IDのみに制限しました。ただし、次のように、同様の方法で:groupを使用して、クエリでGROUPBYを実行するユーザーを指定できるはずです。

:find_options => {:group =>'parent.id'}

これがお役に立てば幸いです。

于 2010-03-30T16:37:57.307 に答える
0

ヘルパーでアイテムのリストを作成し、それを select タグに渡してみませんか?

私は formtastic や act_as_tree についてはよく知りませんが、上記のように動作させるのに問題がある場合は、select に渡す前にオプションを作成するという手段に頼るのは完全に合理的だと思います。

于 2010-01-29T08:01:24.193 に答える