Rails 4.1枚举引发错误而不是将对象设置为无效

Dan*_*ier 9 enums activerecord select ruby-on-rails

我正在使用Rails 4.1枚举字段

class User
    enum category: [ :client, :seller, :provider ]
end
Run Code Online (Sandbox Code Playgroud)

当用户注册时,他从选择框中选择他的类别.默认为空,因为我想强制用户选择一个选项.

如果用户没有选择任何选项,我想返回带有验证消息的表单.这是注册表单中的选择框代码

    <%= f.select :category, [], {}, class: "form-control" do  %>
        <option value="99">Choose an option</option>

        <% User.categories.each do |cat,code| %>
            <option value="<%= code %>" <% if params["user"] && code.to_s == params["user"]["category"] %>selected='selected'<%end%> ><%= t(cat) %></option>
        <% end %>
    <% end %>
Run Code Online (Sandbox Code Playgroud)

当控制器创建用户时,它不会向记录添加验证错误,而是引发异常.怎么避免这个?

ArgumentError - '99' is not a valid category:
  (gem) activerecord-4.1.1/lib/active_record/enum.rb:103:in `block (3 levels) in enum'
  (gem) activerecord-4.1.1/lib/active_record/attribute_assignment.rb:45:in `_assign_attribute'
  (gem) activerecord-4.1.1/lib/active_record/attribute_assignment.rb:32:in `block in assign_attributes
Run Code Online (Sandbox Code Playgroud)

Зел*_*ный 1

如果您尝试设置无效值,则始终会引发enum错误。Rails没有这样的验证base并向记录添加错误消息或添加验证错误。您应该通过错误创建自己的验证rescue

=> u = User.last
=> User.genders
=> {"male"=>0, "female"=>1}
=> u.gender = 'boy'
#> ArgumentError: 'boy' is not a valid gender
=> u.gender = 'male'
#> "male"
Run Code Online (Sandbox Code Playgroud)