问题描述
概述
使用枚举创建表单(复选框)时,
ArgumentError ('1' is not a valid brake):
发生错误
此列只接受整数,拒绝'1'(字符串) 请告诉我如何将字符串转换为整数。
如果您能将专家的智慧借给我们,我们将不胜感激。
导轨'6.0.3'
调试
(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 %>