使用simple_form添加复选框而不与模型关联?

时间:2012-02-07 19:18:48

标签: ruby-on-rails haml simple-form

如何在不与模型关联的情况下添加simple_form复选框? 我想创建一个可以处理一些javascript事件的复选框,但不知道? 也许我错过了文档中的内容? 不希望使用类似如下的内容:

= 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'

6 个答案:

答案 0 :(得分:35)

您可以向模型添加自定义属性:

class Resource < ActiveRecord::Base
  attr_accessor :custom_field
end

然后将此字段用作块:

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

尝试在文档https://github.com/plataformatec/simple_form

中找到“Wrapping Rails Form Helpers”

答案 1 :(得分:33)

您可以使用

f.input :field_name, as: :boolean

答案 2 :(得分:14)

huoxito提出的命令不起作用(至少在Rails 4中没有)。据我所知,错误是由Rails试图查找:custom_field的默认值引起的,但由于此字段不存在,此查找失败并抛出异常。

但是,如果您使用:input_html参数为字段指定默认值,则可行。像这样:

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

答案 3 :(得分:3)

这个问题首先出现在Google上,没有适当的答案。

从Simple Form 3.1.0.rc1开始,有一种正确的方法可以在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
  

然后你可以<%= f.input :thing, as: :fake %>

对于此特定问题,您必须将方法的第二行更改为:

template.check_box_tag(attribute_name, nil, merged_input_options)

对于3.1.0.rc1之前的版本,admgc提供的解决方案是添加缺少的方法merge_wrapper_options

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

答案 4 :(得分:2)

将此添加到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

然后在您的观看中使用它,如:

= 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

即。上述实现正确支持嵌套字段。我见过的其他解决方案都没有。

注意: 此示例为HAML。

答案 5 :(得分:1)

这是另一种变化形式:

= f.label :some_param, class: "label__class" do
  = f.input_field :some_param, class: "checkbox__class"
  Label text