2010-01-28 7 views
7

Теперь с Formtastic у меня есть обычный выбор:Formtastic выбрать с группировкой

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

Здесь я показываю только дети категории. Я использую плагин actions_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 

Я попытался выключтель от 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 синтаксис :)

+0

ли у вас какие-либо удачи с получением это правильно работать в Formtastic? – Codebeef

+0

Пока нет. Я подал вопрос ребятам Formtastic в github. Для групповых опций нет спекулятивного покрытия, и будет оценена неудачная спецификация. – Voldy

+0

Вы поняли это? –

ответ

14

В случае, если кто-то с той же проблемой, вы можете сделать следующее:

<%= f.input :category, :as => :select, :collection => option_groups_from_collection_for_select(ParentCategory.all, :categories, :name, :id, :name) %> 

Reference from Rails API
Recommendation from Justin French (он упоминает удаления: group_by)

+6

У меня проблема с этим, что он не автоматически выбирает связанную категорию. Вы столкнулись с той же проблемой? – Cristian

+1

FYI другим, которые приходят сюда через Google: для автоматического выбора связанной категории, просто передайте идентификатор в качестве 6-го параметра в соответствии с http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i -option_groups_from_collection_for_select – Adam21e

+0

@ Adam21e Я попытался добавить: id как 6-ю награду, но безрезультатно. он автоматически выбирает первый вариант в списке. –

0

Почему бы не попробовать создать свой список предметов в качестве помощника, а затем мимоходом, что в выберите тег?

Я не знаю много о formtastic или actions_as_tree, но если у вас возникли проблемы с его работой, как у вас есть выше, я думаю, что прибегать к созданию ваших опций, прежде чем передавать их на ваш выбор, вполне разумно.

+2

Это работает, когда я обновляю свой вопрос. Но я использую Formtastic и хотел бы использовать его синтаксис. – Voldy

1

Эй, поэтому я пытался решить определенную проблему с помощью форматирования и обнаружил, что вы можете изменить запрос, используемый для создания списка, используя: 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 BY в запросе, например:

: find_options => {: группа => 'parent.id'}

Надеюсь, это поможет.

Смежные вопросы