枚举的 ArgumentError ( is not a valid )

问题描述

概述

使用枚举创建表单(复选框)时,

ArgumentError ('1' is not a valid brake):

发生错误

此列只接受整数,拒绝'1'(字符串) 请告诉我如何将字符串转换为整数。

如果您能将专家的智慧借给我们,我们将不胜感激。

导轨'6.0.3'

调试

跳过表单时param的内容(也有字符串“1”...)

(byebug) params
<ActionController::Parameters {"authenticity_token"=>"...","brake"=>"1","controller"=>"download","action"=>"confirm"} permitted: false>

代码

下载.rb

class Download < ApplicationRecord
    enum brake: {on: 1,off: 0},_prefix: true
end

download_controller.rb

class download_controller < ApplicationController

    SESSION_KEY_FOR_DOWNLOAD = :download

    def new
        @download = ::Download.new
    end

    def confirm
        parameters = download_params
        @download = ::Download.new(parameters)
        session[SESSION_KEY_FOR_DOWNLOAD] = parameters
    end

    def create
        @download = ::Download.new(session[SESSION_KEY_FOR_DOWNLOAD])
        @download.save
        session[SESSION_KEY_FOR_DOWNLOAD] = nil
        redirect_to root_url
    end


    def download_params
        params.permit(:brake )
    end

end

new.html.erb

<%= form_with url: confirm_download_path(@download),local: true do |f| %>
  <fieldset class="form_check-block">
    <label>
      <%= f.check_Box :brake,checked: @download&.brake_on? %>
      <%= f.label " ",class: "top_left" %>
    </label>
  </fieldset>
  <span>brake</span>
  <button>register</button>
<% end %>

shema.rb

  create_table "download",force: :cascade do |t|
    t.integer "brake",limit: 1,default: 1,null: false
    t.datetime "created_at",precision: 6,null: false
    t.datetime "updated_at",null: false
  end

解决方法

您使用带有枚举的复选框(只有两种状态)这一事实可能会突出设计缺陷。 您应该考虑以下更改:

  • 保留复选框并为 brake 属性使用布尔列
  • 使用选择字段并保留 brake 枚举(如果您计划拥有更多状态)

如果要保留复选框和枚举,则需要按名称而不是按值引用 brake 的可能值

f.check_box :brake,{ checked: @download&.brake_on? },:on,:off
,
<%= f.check_box :brake,checked: @download&.brake_on? %>
↓
<%= f.check_box :brake,:off %>