Rails 中的 ArgumentError('1' 不是有效类型)

Joh*_*nny 5 ruby-on-rails ruby-on-rails-5

我正在处理具有选择列表的表单:

<%= f.select :type, options_for_select(Property.types), {prompt: "Select Type of Property..."}, class: "form-control" %>
Run Code Online (Sandbox Code Playgroud)

type是我数据库中的一个整数。该Property.types是从拉列表enum中我的财产模型属性:

enum type: { Type_1: 1, Type_2: 2, Type_3: 3 }
Run Code Online (Sandbox Code Playgroud)

出于某种原因,在提交表单时,我收到一个错误:

ArgumentError ('1' is not a valid type): Completed 500 Internal Server Error in 10ms (ActiveRecord: 4.0ms)

我认为这是因为选定的列表值是作为字符串而不是整数提交的。

我正在使用 Rails v.5.2.1。

如何解决这个问题?

Pav*_*van 6

ArgumentError('1' 不是有效类型)

你应该改变select如下

<%= f.select :type, options_for_select(Property.types.map { |key, value| [key.humanize, key] }), {prompt: "Select Type of Property..."}, class: "form-control" %>
Run Code Online (Sandbox Code Playgroud)

因为这

<%= f.select :type, options_for_select(Property.types), {prompt: "Select Type of Property..."}, class: "form-control" %>
Run Code Online (Sandbox Code Playgroud)

生成selectoptions

<option value="0">Type_1</option>
<option value="1">Type_2</option>
<option value="2">Type_1</option>
Run Code Online (Sandbox Code Playgroud)

因此,在表单提交的值select作为发送"0", "1", "2"这是不是有效类型枚举 type

和这个

<%= f.select :type, options_for_select(Property.types.map { |key, value| [key.humanize, key] }), {prompt: "Select Type of Property..."}, class: "form-control" %>
Run Code Online (Sandbox Code Playgroud)

生成selectoptions

<option value="Type_1">Type 1</option>
<option value="Type_2">Type 2</option>
<option value="Type_3">Type 3</option>
Run Code Online (Sandbox Code Playgroud)

所以,现在的值select作为发送"Type_1", "Type_2", "Type_3"其是有效类型枚举 type

此外,type是一个保留字(在STI 中使用)。我建议将其更改为类似property_type