add checkbox with simple_form without association with model?
Asked Answered
D

6

32

How I can add checkbox with simple_form without association with model? I want to create checkbox which will handle some javascript events, but don't know? Maybe I miss something in documentation? Want't to use similar like following:

= 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'
Derinna answered 7/2, 2012 at 19:18 Comment(2)
if this checkbox haven't association with model why dont use standart checkbox helper? api.rubyonrails.org/classes/ActionView/Helpers/…Christiniachristis
I dont think you can use simple_form helpers without record field. Jus t use simple_form generated classes for your checkbox and you dont need to add custom css. Im notice that you are from Sevastopol come in to our local Sevastopol.rb meetup in this Thusday! Cheers!Christiniachristis
B
36

You can add a custom attribute to the model:

class Resource < ActiveRecord::Base
  attr_accessor :custom_field
end

Then use this field as block:

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

Try to find "Wrapping Rails Form Helpers" in their documentation https://github.com/plataformatec/simple_form

Batruk answered 7/2, 2012 at 21:30 Comment(0)
F
35

You could use

f.input :field_name, as: :boolean
Flexuosity answered 15/2, 2013 at 23:47 Comment(1)
please notice without association with model if the field_name is not defined in the model it wont workTyree
W
19

The command proposed by huoxito does not work (at least not in Rails 4). As far as I figured out the error is caused by Rails trying to look up the default value for :custom_field, but because this field does not exists this lookup fails and an exception is thrown.

However, it works if you specify a default value for the field using the :input_html parameter, e.g. like this:

= f.input :custom_field, :as => :boolean, :input_html => { :checked => "checked" }
Watercourse answered 8/7, 2013 at 18:14 Comment(0)
S
3

This question comes first on google with no appropriate answer.

Since Simple Form 3.1.0.rc1 there is a proper way of doing it explained on the 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

Then you can do <%= f.input :thing, as: :fake %>

For this specific question you have to change the second line of the method to:

template.check_box_tag(attribute_name, nil, merged_input_options)

For versions prior 3.1.0.rc1 admgc gave a solution that is adding the missing method merge_wrapper_options:

https://mcmap.net/q/245011/-undefined-method-merge_wrapper_options

Sansculotte answered 5/5, 2015 at 9:30 Comment(0)
E
3

Add this to 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

then use it in your views like:

= 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

i.e. The above implementation supports nested fields correctly. Other solutions I've seen do not.

Note: This example is HAML.

Endoderm answered 17/9, 2015 at 3:8 Comment(0)
T
1

Here is another variation:

= f.label :some_param, class: "label__class" do
  = f.input_field :some_param, class: "checkbox__class"
  Label text
Timothy answered 17/5, 2020 at 16:52 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.