我正试图让我的无线电和复选框作为按钮w /切换功能工作,如twitters bootstrap页面上所示。 link!
我以某种方式设法让这些按钮出现并与数据库一起运行,但是当用户返回页面时,它们不会被切换。我想知道这是否可能。如果是,我如何在我的代码上实现它?我正在使用simple_form + twitter bootstrap。
以下是我用来显示单选按钮的代码:
<div class="btn-group" data-toggle="buttons-radio">
<%= f.input :child_gender, :label => "Child gender?", :collection => [['Boy', 'Boy'], ['Girl', 'Girl'], :as => :radio_buttons, :input_html => { :data => {:toggle => 'buttons-radio'} }, :item_wrapper_class => 'btn btn-toggle btn-small inline' %>
</div>
以下是复选框按钮的代码:
<div class="btn-group">
<%= f.input :child_size, :label => "What size?", :collection => child_size, :as => :check_boxes, :input_html => { :data => {:toggle => 'buttons-checkbox'} }, :item_wrapper_class => 'btn btn-toggle btn-small' %>
</div>
以下是btn-toggle
的自定义css:
.btn-toggle input {
display: none;
}
感谢任何帮助。
答案 0 :(得分:4)
根据Nickl的回答并调整内容,不需要额外的Javascript,并呈现Bootstrap目前所期望的语义HTML,这是我的解决方案:
class ButtonRadioInput < SimpleForm::Inputs::CollectionRadioButtonsInput
def input
out = '<div class="btn-group" data-toggle="buttons">'
label_method, value_method = detect_collection_methods
collection.each do |item|
value = item.send(value_method)
label = item.send(label_method)
active = ''
active = ' active' unless
out =~ / active/ ||
input_html_options[:value] != value &&
item != collection.last
input_html_options[:value] = value unless active.empty?
btn = 'btn'
btn = "btn btn-#{item.third}" unless item.third.nil?
out << <<-HTML
<label class="#{btn} #{active}">
<input type="radio" value="#{value}" name="#{attribute_name}">#{label}</input>
</label>
HTML
end
out << "</div>"
out.html_safe
end
end
然后使用它你将使用SimpleForm:
=f.input :role, label: false, as: :button_radio,
collection: [["Warm Up", :warm_up, :primary],
["Small Sided", :small_sided, :primary],
["Expanded", :expanded, :primary],
["Game", :game, :primary]]
这将呈现代码,就像Bootstrap's own components page中的单选按钮示例一样。
答案 1 :(得分:2)
您还可以使用隐藏的输入字段和一些不显眼的JavaScript。 将隐藏字段与您在* .html.erb中的twitter引导程序设置为按钮:
<%= f.hidden_field :child_gender %>
<div id="gender-toggle" class="btn-group" data-toggle="buttons-radio">
<button type="button" class="btn" data-gender="boy">Boy</button>
<button type="button" class="btn" data-gender="girl">Girl</button>
</div>
在* .js.coffee中,只需设置活动按钮和输入值:
# Activate selected gender
$("button[data-gender=" + $('#hidden_field_id').val() + "]").addClass('active')
# Set gender value
$("#gender-toggle button").click ->
$('#hidden_field_id').val($(this).data('gender'))
希望这有帮助。
答案 2 :(得分:2)
以下是引导单选按钮所需的simple_form
input
。
# lib/inputs/button_radio_input.rb
class ButtonRadioInput < SimpleForm::Inputs::CollectionRadioButtonsInput
def input
out = <<-HTML
<div class="btn-group" data-toggle="buttons-radio">
HTML
input_field = @builder.hidden_field(attribute_name, input_html_options)
input_id = input_field[/ id="(\w*)/, 1]
label_method, value_method = detect_collection_methods
collection.each {|item|
value = item.send(value_method)
label = item.send(label_method)
on_click = "document.getElementById('#{input_id}').value='#{value}';return false;"
active = ''
active = ' active' unless
out =~ / active/ ||
input_html_options[:value] != value &&
item != collection.last
input_html_options[:value] = value unless active.empty?
btn = 'btn'
btn = "btn btn-#{item.third}" unless item.third.nil?
out << <<-HTML
<button onclick="javascript:#{on_click}" type="button" class="#{btn}#{active}">#{label}</button>
HTML
}
value = <<-VAL
value="#{input_html_options[:value]}"
VAL
input_field[/value="[^"]*"/] = value.chomp if input_field =~ /value/
input_field[/input/] = "input #{value.chomp}" unless input_field =~ /value/
out << <<-HTML
#{input_field}
</div>
HTML
out.html_safe
end
end
它支持as: :radio_buttons
接受的所有内容,并为按钮样式添加了可选的第3个参数。
= f.input :rad_buttons,
as: :button_radio,
collection: [ [:blue, 1, :primary],
[:red, 2, :danger],
[:green, 3, :success],
]
上面的haml片段会产生一个三个单选按钮组
btn-primary
,标签为blue
,值为1
btn-danger
,标签为red
,值为2
btn-success
,标签为green
,值为3
由于我们没有分配值(input_html: {value: 1}
),因此最后一个按钮将处于活动状态(与普通单选按钮的行为相同),rad_buttons
的值将为3
的nJoy!