从' 0'更改开关值/' 1'到Rails simple_form上的字符串

时间:2016-06-21 14:25:04

标签: ruby-on-rails simple-form

所以我使用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将字符串值保存到数据库中并在重新输入表单时显示存储的值?

谢谢!

1 个答案:

答案 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