Rails 4枚举validation

这是我第一次使用带有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 

在我看来,我有这一点(使用简单的forms):

 = 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 

所以当我提交create form和create action fire时,我得到了这个validation错误:

 '1' is not a valid status 

所以我认为我知道问题是数据类型所以我在模型中添加了这个位:

 before_validation :set_status_type def set_status_type self.status = status.to_i end 

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

你可以在这里找到解决方案。

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

  

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

或者,您可以添加如下validation:

 validates_inclusion_of :status, in: Shipping.statuses.keys 

但是,我不确定这种validation是否有意义,因为尝试为状态分配无效值会引发ArgumentError( 请参阅此内容 )。