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)
如果您尝试设置无效值,则始终会引发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)
| 归档时间: |
|
| 查看次数: |
2947 次 |
| 最近记录: |