Теперь с 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>
Как использовать группировку в выборе Formtastic для модели с acts_as_tree функциональностью? Кто-либо знает?
ОБНОВЛЕННЫЙ
Я выяснил, что это должно работать:
= f.input :category, :include_blank => false, :group_by => :parent
но это не делает с ошибкой:
undefined local variable or method `object_class' for #<Formtastic::SemanticFormBuilder:0x87d3158>
Похоже, что в Formtastic существует некоторая ошибка. Я просмотрел formtastic.rb и нашел object_class в detect_group_association методе:
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
Я попробовал swith от Acts_as_tree и записи, мое собственное самосослалось на assositions. То же как работы 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)
p.s: top_categories является вспомогательным методом с набором родительских категорий.
Последняя вещь, переводят его в синтаксис Formtastic :)
Почему бы не попробовать создать свой список предметов в помощнике, а затем передавать это в тег выбора?
Я не знаю много о формастице, или acts_as_tree, но если у вас возникли проблемы с тем, как у вас есть проблемы Выше я думаю, прибегая к созданию ваших вариантов, прежде чем передавать их в ваш выбор, совершенно разумный.
Привет, я пытался решить конкретную проблему с помощью formtastic и обнаружил, что вы можете изменить запрос, используемый для построения списка, используя: find_options. Глядя на код, я увидел, что если вы не укажете: group_by, то список значений в конечном итоге сводится к поиску (: all) объекта модели (в методе, называемом find_raw_collection_for_column в formtastic.rb). Параметры после: 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 для запроса только идентификатором текущего округа. Но вы должны иметь возможность использовать: group аналогичным образом, чтобы указать, кого вы хотите GROUP BY в своем запросе, например:
: find_options => {: group => 'parent.id'}
Надежды это помогает.