【问题标题】:Min value for input in Simple Form简单形式输入的最小值
【发布时间】:2014-04-21 03:51:20
【问题描述】:

我想用SimpleForm创建一个简单的资金输入。

money 字段的最小值应为 0,这样用户就不能输入小于 0 的值。

但是我不知道如何用简单的形式定义最小值。

我想知道这是否可能。

【问题讨论】:

    标签: ruby-on-rails simple-form


    【解决方案1】:

    绝对!您想要的表单的(简化)HTML 如下所示:

    <form>
        <input type="number" min="0" step="any" name="amount">
    </form>
    

    请注意输入字段中两个非常重要的属性:min 设置为 0,因为您不允许负数,step 设置为 any,因为您希望允许输入小数。例如,如果您只想要美元金额,您可以设置step="1"。此外,如果您想设置一个最大值,您可以使用 max 属性。

    重要提示:这仅在客户端执行验证。如果您知道自己在做什么,则可以覆盖它,因此请确保您仍然验证使用此表单发送的输入在服务器上是否有效。

    我不是 Ruby 人,但通过阅读 Simple Form docs,我认为这应该可行:

    <%= simple_form_for @transaction do |f| %>
        <%= f.input :amount, input_html: { min: '0', step: 'any' } %>
        <%= f.button :submit %>
    <% end %>
    

    假设你的模型中的数量是一个数字类型,它会自动为你输入一个输入[type=number]。

    【讨论】:

    • 这在较新的版本中不起作用。试试in: 1.0..200.0, step: 1 之类的东西。下面的答案中显示了一个示例。
    【解决方案2】:

    simple_form 将根据模型的验证设置输入属性,这意味着您的客户端和服务器端验证将匹配并覆盖具有支持 HTML5 新输入类型和属性的精美现代浏览器的用户,以及具有不支持的旧浏览器。

    例如,给定这个模型:

    class Purchase < ActiveRecord::Base
      validates :amount, numericality: { greater_than_or_equal_to: 1 }
    end
    

    还有这个观点:

    <%= simple_form_for Purchase.new do |f| %>
      <%= f.input :amount %>
    <% end %>
    

    生成的标记将如下所示(为了清楚起见,我删除了一些属性):

    <form …>
      <div>
        <label for="purchase_amount">Amount</label>
        <input id="purchase_amount" name="purchase[amount]"
               min="1"  step="1" type="number" />
      </div>
    </form>
    

    如另一个答案中所述,如果您想覆盖默认属性,您可以在调用#input 时使用input_html 选项:

    <%= simple_form_for Purchase.new do |f| %>
      <%= f.input :amount, input_html: { min: 0 } %>
    <% end %>
    

    【讨论】:

    • 我已经将validates :amount, numericality: { greater_than_or_equal_to: 1 } 准确地放在我的模型属性上,这不会将视图中的min 属性添加到amount 输入中。您能否发布一个文档链接以确认您的答案?
    • 这不完全是文档,但这里有一个来自 simple_form 的测试用例,它确认了这个功能:github.com/plataformatec/simple_form/blob/…
    【解决方案3】:

    要使@georgebrock 的答案起作用,您需要在 simple_form.rb(或您使用的任何名称,可能是 simple_form_bootstrap.rb)中进行更改:

    b.optional :min_max
    

    收件人:

    b.use :min_max
    

    用于绘制输入的包装器。

    “可选”表示简单表单将使用组件但不会自动查找,让您在输入中手动指定 :min 和 :max 参数。

    【讨论】:

    • 为此,您需要使用greater_than_or_equal_toless_than_or_equal_to 数字验证器选项,而不是greater_thanless_than
    【解决方案4】:

    @alexander-s 的答案通常是正确的。

    但是,我遇到了 simple_form.rb 被 simple_form_bootstrap.rb 运行的问题,他们指示您不要更改。它列出了b.optional :min_max 很多地方。

    我没有使用@alexander-s 提到的b.use :min_max 的全局设置,而是使用了

    <%= f.input :amount, min_max: true %>
    

    这样会更好,因为它可以重复使用模型中设置的最小值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      相关资源
      最近更新 更多