2013-04-06 5 views
7

Dies scheint wie es ziemlich einfach sein sollte, kaufen Ich habe keine Dokumentation zu diesem Thema gefunden.Active Admin: Wie Etiketten für ausgewählte Filter anpassen?

Ich habe folgende Filter:

filter :archived, as: :select 

..., die mir einen Arbeitsfilter in Form einer Auswahlbox mit den Optionen "Any", "Ja" und "Nein" gibt.

Meine Frage ist: Wie passe ich diese Beschriftungen so an, dass die Funktionalität gleich bleibt, aber die Beschriftungen stattdessen "Alle", "Live" und "Archiviert" sind?

Antwort

13

Die schnell und einfach:

filter :archived, as: :select, collection: [['Live', 'true'], ['Archived', 'false']] 

jedoch, dass Sie nicht einen Weg geben, die Option „Alle“ zu gestalten, ohne I18n zu ändern.

AKTUALISIERT: Hier ist eine weitere Option:

# Somewhere, in an initializer or just straight in your activeadmin file: 
class ActiveAdmin::Inputs::FilterIsArchivedInput < ActiveAdmin::Inputs::FilterSelectInput 
    def input_options 
    super.merge include_blank: 'All' 
    end 

    def collection 
    [ ['Live', 'true'], ['Archived', 'false'] ] 
    end 
end 

# In activeadmin 
filter :archived, as: :is_archived 
0

ich hatte das gleiche Problem, aber ich brauche individuelle Auswahl in Index-Filter und Formulareingaben, so habe ich eine ähnliche Lösung gefunden: In app/Eingänge (wie vorschlagen formtastic) ich schaffe zwei clases:

In app/Ein-/country_select_input.rb:

class CountrySelectInput < Formtastic::Inputs::SelectInput 

    def collection 
    I18nCountrySelect::Countries::COUNTRY_CODES.map { |country_code| 
     translation = I18n.t(country_code, scope: :countries, default: 'missing') 
     translation == 'missing' ? nil : [translation, country_code] 
    }.compact.sort 
    end 

end 

In app/Ein-/filter_country_select_input.r b:

class FilterCountrySelectInput < ActiveAdmin::Inputs::FilterSelectInput 

    def collection 
    I18nCountrySelect::Countries::COUNTRY_CODES.map { |country_code| 
     translation = I18n.t(country_code, scope: :countries, default: 'missing') 
     translation == 'missing' ? nil : [translation, country_code] 
    }.compact.sort 
    end 

end 

Und in meiner app/admin/city.rb:

ActiveAdmin.register City do 

    index do 
    column :name 
    column :country_code, sortable: :country_code do |city| 
     I18n.t(city.country_code, scope: :countries) 
    end 
    column :created_at 
    column :updated_at 
    default_actions 
    end 

    filter :name 
    filter :country_code, as: :country_select 
    filter :created_at 

    form do |f| 
    f.inputs do 
     f.input :name 
     f.input :country_code, as: :country_select 
    end 
    f.actions 
    end 

end 

Wie Sie sehen können, ActiveAdmin sucht Filter [: your_custom_name:] Eingabe und [: your_custom_name:] Eingang in unterschiedlicher Kontext, Indexfilter oder Formulareingaben. So können Sie diese Erweiterung von ActiveAdmin :: Inputs :: FilterSelectInput oder Formtastic :: Inputs :: SelectInput erstellen und Ihre Logik anpassen.

Es funktioniert für mich, ich hoffe, Sie finden es nützlich

0

Hier ist ein Hack, das funktioniert ... ohne dass Sie neue Eingänge Kontrollen zu schreiben!

filter :archived, as: :select, collection: -> { [['Yes', 'true'], ['No', 'false']] } 

index do 
    script do 
    """ 
     $(function() { 
     $('select[name=\"q[archived]\"] option[value=\"\"]').text('All'); 
     }); 
    """.html_safe 
    end 
    column :id 
    column :something 
end 

Es ist nicht "sauber" noch "elegant", aber funktioniert gut genug :)

Verwandte Themen