Rails - 表单验证失败后未预先选择选择标签

hrs*_*ono 4 forms ruby-on-rails

我有选择标签

 <%= f.select :gender, ["M", "F"], include_blank: "---" %>
Run Code Online (Sandbox Code Playgroud)

如果其他字段有错误,即使我之前选择了一个选项,选择标签也会重置为“---”。

我发现的解决方案是使用collection_selectActiveRecord 模型作为选项值对。

有没有其他方法可以做到这一点?

谢谢

[编辑]

@Micah 的答案是正确的,但由于我的表单是嵌套的,因此语法不同。

这是我的代码:

<%= f.fields_for :users do |ff| %>
  ...
  <%= ff.select :gender, ["M", "F"], include_blank: "---",
        selected: ff.object.gender ? ff.object.gender : ""  %>
  ...
<% end %>
Run Code Online (Sandbox Code Playgroud)

MCB*_*ama 5

当我处理错误时,我通常会render再次显示上一页,因此我将首先解释如何处理。

当您渲染视图时,传递到上一个命令params[:object][:gender]中的参数会保留下来,这意味着您将在返回视图时将其作为参数。因此

<%= f.select :gender, ["M", "F"], include_blank: "---", selected: params[:object] ? params[:object][:gender] :"" %>
Run Code Online (Sandbox Code Playgroud)

会将所选值设置回第一次选择的值。基本上它所做的是接受一个条件,然后在同一行中提供一个 if/else。(conditional) ? if true do this : else do this. 在这种情况下,条件是params[:object]存在(意味着您之前曾尝试创建/编辑一次),如果是,则重新分配值,否则留空并选择默认值,即您的“---”。

如果您使用redirect_to,您实际上必须通过重定向手动将参数传回,但这相当简单,只需执行以下操作:

redirect_to new_object_path(params)