根据数组/ proc验证输入和填充选项

时间:2016-02-24 01:09:11

标签: ruby-on-rails validation

我有一个User模型(顺便说一下,使用Devise)。

我添加了一组自定义字段,其中一些具有相当复杂的值(如就业状况,行业等)。

我尝试使用我在User模型中定义的预定义值集,以便我可以:

  1. 使用预先确定的值列表填充编辑屏幕
  2. 验证输入提交以确保用户选择的选项是可用选项
  3. 让我们选择性别"例如,字段设置和验证。它很接近,但是当我在这里验证第二个例子时,我无法让它工作:

    class User < ActiveRecord::Base
    
      validates :gender,
                :inclusion => { :in => proc { |record| record.options_gender } }
    
      # Attempt 1: This doesn't work, but is what I need, because it defines both values to store, and also text strings to display.
      def options_gender
        [
            ['Male','male'],
            ['Female','female'],
            ['I\'d rather not say','nonspecific']
        ]
      end
    
      # Attempt 2: This does work for the validation, but doesn't let me define the corresponding text to display
      def options_gender
        ['male', 'female', 'nonspecific']
      end
    
    end
    

    我的options_gender也被提取到用户的编辑表单中:

    <%= f.input :gender, :collection => @user.options_gender, label: "Which gender do you identify as?" %>
    

    也许有一种方法可以修复尝试1 以正确验证,或者我可以用来实现此目的的其他技术。

1 个答案:

答案 0 :(得分:0)

试试这个

class User < ActiveRecord::Base
  validates :gender, inclusion: { in: proc {|user| user.options_gender.keys }}

  def options_gender
    {'male'=>'Male', 'female'=>'Female', 'nonspecific'=>'I\'d rather not say'}
  end
end

和这个

<%= f.input :gender, :collection => @user.options_gender.sort.map {|k,v| [v,k]}, label: "Which gender do you identify as?" %>