【问题标题】:Rails 4 enum validationRails 4 枚举验证
【发布时间】:2014-10-25 03:54:26
【问题描述】:

这是我第一次使用带有 rails 4 的枚举,我遇到了一些问题,想到了几个肮脏的解决方案,并想检查是否有更优雅的解决方案:

这是我的表迁移相关部分:

create_table :shippings do |t|
  t.column :status, :integer, default: 0
end

我的模特:

class Shipping < ActiveRecord::Base
  enum status: { initial_status: 0, frozen: 1, processed: 2 }
end

我认为这一点(使用简单的形式):

= f.input :status, :as => :select, :collection => Shipping.statuses, :required => true, :prompt => 'Please select', label: false

所以在我的控制器中:

  def create
    @shipping = Shipping.create!(shipping_params)

    if @shipping.new_record?
      return render 'new'
    end

    flash[:success] = 'Shipping saved successfully'
    redirect_to home_path
  end

private

  def shipping_params
    params.require(:shipping).permit(... :status)
  end

因此,当我提交创建表单并触发创建操作时,我收到此验证错误:

'1' is not a valid status

所以我以为我知道问题出在数据类型上,所以我在模型中添加了这一点:

before_validation :set_status_type

  def set_status_type
    self.status = status.to_i
  end

但这似乎没有做任何事情,我该如何解决这个问题?有没有人有过类似的经历?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 enums


    【解决方案1】:

    您可以找到解决方案here

    基本上,您需要传递字符串('initial_status'、'frozen' 或 'processed'),而不是整数。换句话说,您的表单需要如下所示:

    <select ...><option value="frozen">frozen</option>...</select>
    

    您可以通过在表单中​​输入statuses.keys 来实现此目的。另外(我相信)你不需要before_validation

    或者,您可以添加这样的验证:

    validates_inclusion_of :status, in: Shipping.statuses.keys
    

    但是,我不确定此验证是否有意义,因为尝试为状态分配无效值会引发 ArgumentError (see this)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 2010-09-06
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 2016-08-02
      相关资源
      最近更新 更多