在 Rails 4 中使用常量作为 select 框的选项
Use a constant as options for select box in Rails 4
我有一个模型 (Bar
),它需要一个可能适用于记录的种族属性列表。该模型是模型 Foo
的嵌套属性(我认为这不重要,但只是彻底......)。我没有创建模型来管理这个短列表,而是在我的应用程序中定义了一个常量。然后我可以在验证等中引用该常量。它在验证模型时工作正常 - 我的所有测试都通过了绿色。
我还可以在视图中看到值列表(在 Bar
模型的 new.html.haml
视图中)。我可以 select 在这些项目中,参数看起来是正确的。但是,值 selected 没有发布到数据库。
模型 Bar
的列 :ethnicity
为 type:string。用于定义选项范围的常量是:
ETHNIC_GROUPS = [nil, "African American/Black", "American Indian", "Hispanic", "Puerto Rican",
"Alaskan Native", "Asian American/Pacific Islander", "Mexican American/Chicano"]
在视图文件中,我为模型创建了一个 select离子盒:
#app/views/bar/new.html.haml
= form_for([@foo, @bar]) do |f|
# form elements omitted
= f.label :ethnicity
= f.select :ethnicity, CommonConstants::ETHNIC_GROUPS
= f.submit "Create New Bar"
在前端,我看到 ETHNIC_GROUPS 常量中的选项可用于 selection。 selecting 元素后,参数显示正确:
--- !ruby/hash:ActionController::Parameters
utf8: "✓"
authenticity_token: YKvYw3T6q+6DsLA6qdH2yYvFtDAOuBFggCMDclIHlvQ0DvJbZqSdniLMZCivmWINjb3ZoCVWF890Mu4vB3VHrw==
bar: !ruby/hash:ActionController::Parameters
name: Test Hispanic Selection
# parameters omitted for clarity
ethnicity: Hispanic
# parameters omitted for clarity
notes: ''
commit: Add New Bar
controller: bars
action: create
foo_id: '4'
据我所知,参数中的所有内容看起来都完全正确。然而,在成功创建该记录后,种族列中的数据库中没有任何内容。 SQL 查询(在 postgres 中)显示:
select name, ethnicity from bar;
name | ethnicity
----------------------------------------------------+-----------
African American |
American Indian |
Hispanic |
为了更好的衡量,这里是 Bar 的验证:
#app/models/bar.rb
class Bar < ActiveRecord::Base
belongs_to :foo
validates :ethnicity, inclusion: { in: CommonConstants::ETHNIC_GROUPS }, allow_nil: true
end
我真的被难住了。无法弄清楚为什么常量定义的 selection 数组中的值没有传递到数据库 - 尽管它似乎传递到参数哈希中。
** 编辑 **
只是想添加 html 以防有帮助:
<select name="bar[ethnicity]" id="bar_ethnicity">
<option value=""></option>
<option value="African American/Black">African American/Black</option>
<option value="American Indian">American Indian</option>
<option value="Hispanic">Hispanic</option>
<option value="Puerto Rican">Puerto Rican</option>
<option value="Alaskan Native">Alaskan Native</option>
<option value="Asian American/Pacific Islander">Asian American/Pacific Islander</option>
<option value="Mexican American/Chicano">Mexican American/Chicano</option>
</select>
确保您已将 ethnicity
参数列入白名单:
def bar_params
params.require(:bar).permit(:ethnicity) # ...
end
我有一个模型 (Bar
),它需要一个可能适用于记录的种族属性列表。该模型是模型 Foo
的嵌套属性(我认为这不重要,但只是彻底......)。我没有创建模型来管理这个短列表,而是在我的应用程序中定义了一个常量。然后我可以在验证等中引用该常量。它在验证模型时工作正常 - 我的所有测试都通过了绿色。
我还可以在视图中看到值列表(在 Bar
模型的 new.html.haml
视图中)。我可以 select 在这些项目中,参数看起来是正确的。但是,值 selected 没有发布到数据库。
模型 Bar
的列 :ethnicity
为 type:string。用于定义选项范围的常量是:
ETHNIC_GROUPS = [nil, "African American/Black", "American Indian", "Hispanic", "Puerto Rican",
"Alaskan Native", "Asian American/Pacific Islander", "Mexican American/Chicano"]
在视图文件中,我为模型创建了一个 select离子盒:
#app/views/bar/new.html.haml
= form_for([@foo, @bar]) do |f|
# form elements omitted
= f.label :ethnicity
= f.select :ethnicity, CommonConstants::ETHNIC_GROUPS
= f.submit "Create New Bar"
在前端,我看到 ETHNIC_GROUPS 常量中的选项可用于 selection。 selecting 元素后,参数显示正确:
--- !ruby/hash:ActionController::Parameters
utf8: "✓"
authenticity_token: YKvYw3T6q+6DsLA6qdH2yYvFtDAOuBFggCMDclIHlvQ0DvJbZqSdniLMZCivmWINjb3ZoCVWF890Mu4vB3VHrw==
bar: !ruby/hash:ActionController::Parameters
name: Test Hispanic Selection
# parameters omitted for clarity
ethnicity: Hispanic
# parameters omitted for clarity
notes: ''
commit: Add New Bar
controller: bars
action: create
foo_id: '4'
据我所知,参数中的所有内容看起来都完全正确。然而,在成功创建该记录后,种族列中的数据库中没有任何内容。 SQL 查询(在 postgres 中)显示:
select name, ethnicity from bar;
name | ethnicity
----------------------------------------------------+-----------
African American |
American Indian |
Hispanic |
为了更好的衡量,这里是 Bar 的验证:
#app/models/bar.rb
class Bar < ActiveRecord::Base
belongs_to :foo
validates :ethnicity, inclusion: { in: CommonConstants::ETHNIC_GROUPS }, allow_nil: true
end
我真的被难住了。无法弄清楚为什么常量定义的 selection 数组中的值没有传递到数据库 - 尽管它似乎传递到参数哈希中。
** 编辑 **
只是想添加 html 以防有帮助:
<select name="bar[ethnicity]" id="bar_ethnicity">
<option value=""></option>
<option value="African American/Black">African American/Black</option>
<option value="American Indian">American Indian</option>
<option value="Hispanic">Hispanic</option>
<option value="Puerto Rican">Puerto Rican</option>
<option value="Alaskan Native">Alaskan Native</option>
<option value="Asian American/Pacific Islander">Asian American/Pacific Islander</option>
<option value="Mexican American/Chicano">Mexican American/Chicano</option>
</select>
确保您已将 ethnicity
参数列入白名单:
def bar_params
params.require(:bar).permit(:ethnicity) # ...
end