2012-02-07 15 views
24

Jak mogę dodać pole wyboru z simple_form bez powiązania z modelem? Chcę utworzyć pole wyboru, które będzie obsługiwać niektóre zdarzenia javascript, ale nie wiem? Może brakuje mi czegoś w dokumentacji? Want't używać podobnie jak następuje:dodać pole wyboru z simple_form bez powiązania z modelem?

= simple_form_for(resource, as: resource_name, url: session_url(resource_name), wrapper: :inline) do |f| 
    .inputs 
    = f.input :email, required: false, autofocus: true 
    = f.input :password, required: false 
    = f.input :remember_me, as: :boolean if devise_mapping.rememberable? 
    = my_checkbox, 'some text' 
+0

jeśli to pole wyboru nie ma związku z modelem, dlaczego nie używasz pomocnika ze standardowym checkboksem? http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-check_box_tag –

+0

Jestem leniwy używać różnych css) –

+0

Nie sądzę, że możesz używać prostego pomocy bez pola rekordu. Jus t należy użyć klas generowanych przez simple_form dla swojego pola wyboru i nie trzeba dodawać niestandardowego css. Im zauważyć, że jesteś z Sevastopol wejść na nasze spotkanie w Sewastopol.rb w tym dniu! Twoje zdrowie! –

Odpowiedz

34

Możesz dodać atrybut niestandardowy dla modelu

class Resource < ActiveRecord::Base 
    attr_accessor :custom_field 
end 

następnie użyć tego pola jako blok:

= f.input :custom_field, :label => false do 
    = check_box_tag :some_name 

spróbować znaleźć „Zawijanie Rails Forma pomocnicy” w ich dokumentacji https://github.com/plataformatec/simple_form

+0

To zaoszczędziło mi wielu kłopotów. Wielkie dzięki. –

+3

Jest to pomocne odpowiedzi, powinien zostać przyjęty IMHO – hananamar

31

Można użyć

f.input :field_name, as: :boolean 
+0

To powinno być zaakceptowane odpowiedź –

+14

proszę zauważyć 'bez związku z model' jeśli' field_name' nie jest zdefiniowane w modelu to przyzwyczajenie praca – Muntasim

12

Proponowane przez huoxito polecenie nie działa (przynajmniej nie w Rails 4). O ile zorientowałem się, błąd jest spowodowany przez Railsy próbujące wyszukać domyślną wartość dla :custom_field, ale ponieważ to pole nie istnieje, to wyszukiwanie kończy się niepowodzeniem i generowany jest wyjątek.

Jednak to działa, jeśli określić wartość domyślną dla pola przy użyciu parametru :input_html, np tak:

= f.input :custom_field, :as => :boolean, :input_html => { :checked => "checked" } 
2

To pytanie pojawia się jako pierwsze w google bez odpowiedniej odpowiedzi.

Ponieważ prosta forma 3.1.0.rc1 jest właściwy sposób to zrobić wyjaśnione na wiki: https://github.com/plataformatec/simple_form/wiki/Create-a-fake-input-that-does-NOT-read-attributes

app/inputs/fake_input.rb:

class FakeInput < SimpleForm::Inputs::StringInput 
    # This method only create a basic input without reading any value from object 
    def input(wrapper_options = nil) 
    merged_input_options = merge_wrapper_options(input_html_options, wrapper_options) 
    template.text_field_tag(attribute_name, nil, merged_input_options) 
    end 
end 

Następnie można zrobić <%= f.input :thing, as: :fake %>

Na tej konkretnej kwestii trzeba zmienić drugą linię metody do:

template.check_box_tag(attribute_name, nil, merged_input_options) 

W wersjach przed 3.1.0.rc1 admgc dało rozwiązanie, które jest dodanie brakującego metodę merge_wrapper_options:

https://stackoverflow.com/a/26331237/2055246

2

Dodaj to do app/inputs/arbitrary_boolean_input.rb:

class ArbitraryBooleanInput < SimpleForm::Inputs::BooleanInput 
    def input(wrapper_options = nil) 
    tag_name = "#{@builder.object_name}[#{attribute_name}]" 
    template.check_box_tag(tag_name, options['value'] || 1, options['checked'], options) 
    end 
end 

następnie używać go w swoich poglądów jak:

= simple_form_for(@some_object, remote: true, method: :put) do |f| 
    = f.simple_fields_for @some_object.some_nested_object do |nested_f| 
    = nested_f.input :some_param, as: :arbitrary_boolean 

tj. Powyższa implementacja poprawnie obsługuje zagnieżdżone pola. Inne rozwiązania, które widziałem, nie są.

Uwaga: Ten przykład jest haml.