所以我使用Rails simple_form和下面的输入来使用开关:
class SwitchInput < SimpleForm::Inputs::Base
def input
input_html_classes.unshift('fg-line')
template.content_tag(:div, class: 'toggle-switch') do
template.concat @builder.check_box(attribute_name, input_html_options)
template.concat inline_label
end
end
def inline_label
template.content_tag(:label, class: 'ts-helper') do
template.concat options[:inline_label]
end
end
end
我试图创建一个将输入值保存为字符串的开关;如果它切换到左侧(默认),则保存的值为&#34;小&#34;如果开关转到右侧,则保存的值为&#34;大&#34;。
现在我将价值保存为&#34;小&#34; /&#34;大&#34;通过before_save
回调:
private def convert_switch_value
if size == '0'
self.size = 'small'
else
self.size = 'large'
end
return true
end
这是有问题的,因为当用户返回表单时,保存的值不会随交换机显示;无论将值保存到数据库中,开关始终都会关闭。
有没有办法只使用simple_form将字符串值保存到数据库中并在重新输入表单时显示存储的值?
谢谢!
答案 0 :(得分:0)
您可以使用simple_form来完成,但在保存之前更改表单值可能不是simple_form的问题。
我的猜测是,有些情况下调用model.size
您实际上希望它返回'small'
或'large'
,而不是'0'
或'1'
。如果是这样,那么只是覆盖模型中的getter和setter就不会起作用。
试试reform gem。当你有多种方式时,它会很有帮助。设置模型值。改革是形式渲染器和模型之间的中间人。您可以将模型附加到改造对象并将改造对象传递给simple_form,而不是将模型传递给它。在改革的形式对象中,您可以放置所有表单解析逻辑。这是一个例子:
class YourModelForm < Reform::Form
property :size
def size # override getter
if super == 'small'
'0'
elsif super == 'large'
'1'
end
end
def size=(value) # override setter
if value == '0'
super('small')
elsif value == '1'
super('large')
end
end
end