相关疑难解决方法(0)

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

我正在使用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)

enums activerecord select ruby-on-rails

9
推荐指数
1
解决办法
2947
查看次数

Rails 4枚举验证

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

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

create_table :shippings do |t|
  t.column :status, :integer, default: 0
end
Run Code Online (Sandbox Code Playgroud)

我的模特:

class Shipping < ActiveRecord::Base
  enum status: { initial_status: 0, frozen: 1, processed: 2 }
end
Run Code Online (Sandbox Code Playgroud)

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

= f.input :status, :as => :select, :collection => Shipping.statuses, :required => true, :prompt => 'Please select', label: false
Run Code Online (Sandbox Code Playgroud)

所以在我的控制器中:

  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
Run Code Online (Sandbox Code Playgroud)

因此,当我提交create form和create action fire时,我收到此验证错误:

'1' is …
Run Code Online (Sandbox Code Playgroud)

enums ruby-on-rails ruby-on-rails-4

6
推荐指数
1
解决办法
6424
查看次数

在ActiveRecord中标记无效属性

我正在尝试实现一种功能,其中一旦设置了属性,就无法在ActiveRecord模型上更改.为此,我写了以下方法:

def address
 self[:address]
end

def address=(val)
 if new_record?
  self[:address] = val
 else
  errors.add(:address, "Cannot change address, once it is set")
  return false # tried return nil here first, did not work
 end
end
Run Code Online (Sandbox Code Playgroud)

我在这里做错了吗?一旦我尝试更改地址,我希望该对象无效,但我没有遇到任何错误obj.valid?

编辑:一旦设置值,该值不会更改,但是当我通过obj.valid进行验证时,我想获得无效对象?

activerecord jrubyonrails ruby-on-rails-3

3
推荐指数
1
解决办法
2478
查看次数