验证选项的存在

时间:2013-09-05 18:07:04

标签: ruby-on-rails ruby

如果选择了某个选项,我有一个表单要验证。 我不想接受默认的启动选项“请选择产品”

我现在使用它并获得未初始化的内容错误。我相信我写的语法错了。 控制器:

validates :product_name, :presence => { :unless => (product_name = "Please Select a Product")}

查看:

        <span class="span5 pagination-right">
            <%= f.label "Product" %>
            <%= f.select :product_name, options_for_select([ ["Please Select a Product"] ]) %>
        </span>

我应该怎么写这个选项? 谢谢

product_name更改为:

<script>
$(document).ready(function() {

    $('#ticket_product_name').html("<option>Please Select a Product</option>");
    $('#ticket_firmware_version_string').html("<option>Please Select a Firmware</option>");

    $('#category').change(function(){

        $('#ticket_product_name').html("<option>Please Select a Product</option>");
        $('#ticket_firmware_version_string').html("<option>Please Select a Firmware</option>");

        if ($('#category').val() == "blah")
        { 
            $('#ticket_product_name').append("<option>blah</option>");
            $('#ticket_product_name').append("<option>blah</option>");
        }
        else if ($('#category').val() == "another category")
        { 
            $('#ticket_product_name').append("<option>blah product</option>");
        }

直到选项结束,结束脚本。

4 个答案:

答案 0 :(得分:2)

您应该使用the select helper中的include_blank,如下所示:

<%= f.select :product_name, options_for_select([["opt1",1],["opt2",2]]), include_blank: true %>

然后,在模型上

validates :product_name, :presence => true

@MrYoshiji在我的回答中评论了一些真实的东西 - 如果你不允许它是空白的,那么简单的方法就是不在选择中添加空白选项

答案 1 :(得分:2)

我认为你要找的是这个选择的占位符。在这种情况下,我使用了禁用选项:

<% options = options_for_select(["Select an option", ["Product #1",1], ["Product #2",2]], disabled: "Select an option") %>

<%= f.select :product_name, options %>

答案 2 :(得分:2)

我建议使用:prompt选项作为你的选择助手(关于这个的文档不是很直接的转发,但是在同一个版本的同一个版本中它是可以的:http://apidock.com/rails/ActionView/Helpers/FormTagHelper/select_tag)。这允许您定义一个帮助文本字符串以鼓励用户选择一个选项,但在提交表单时将提交一个nil值。

<%= f.select :product_name, PRODUCT_NAME_OPTIONS, prompt: 'Select an option' %>

我建议的下一件事是......不是验证模型的存在,而是执行validates_inclusion_of。这样,您可以在模型中定义选项集,然后在上面的select helper中使用相同的选项集,以及验证中的选项。这样你就知道表单没有被操作以包含一个不同的选项,它实际上让事情有点干嘛。

Product

PRODUCT_NAME_OPTIONS = {'opt 1' => 'opt1', 'opt 2' => 'opt2'}

validates_inclusion_of :product_name, :in => PRODUCT_NAME_OPTIONS.values, :message => 'choose from the available options'

答案 3 :(得分:0)

我只是添加了一个长度验证,而不是让它太复杂,因为默认值比产品名称长得多。简单是最好的,但是应该有一个字符串验证器选项。

 validates :product_name, presence: true, length: {
maximum: 21,
too_long: ": Must select a product"

}