我希望有一个固定的选择框,它提供1到5的选项。其中3是页面加载时的默认值。
<%= f.select(:priority, ['5', '4', '3', '2', '1'], {:selected => '3'}, {:class=>'chzn-select', :style => 'width:350px'}) %>
现在当有人选择4并提交表单时,如果表单验证错误并显示表单,则应保留该值。
我的代码似乎在提交表单后零售价值,并且有验证错误。
答案 0 :(得分:1)
当您使用form_for
包装对象时,设置到该对象的值将显示在表单字段中。所以你应该自动获得你想要的行为。问题似乎是您通过在帮助程序中设置selected
选项来覆盖该行为,该选项是对html中的select元素进行硬编码。
使用options_for_select
指定值和默认选择的选项:
<%= f.select(:priority, options_for_select(['5', '4', '3', '2', '1'], 3),
{},
class: "chzn-select",
style: "width: 350px" %>
通过这种方式,默认选项(3
)作为第二个参数传递给options_for_select
,仅在f.object.priority
尚未初始化时使用。
另一个(好)选项是不在视图中设置默认选定值,而是在初始化对象时在控制器中设置:
def new
@my_object = MyObject.new(priority: 3)
end
def create
@my_object = MyObject.new(my_object_params)
if @my_object.save
# ...
else
render :new
end
end
这样,当表单加载时,form_for
将包装您的对象(@my_object
)并再次默认为3
。在create
操作中,无论用户将其设置为什么,都会设置它,在再次使用验证错误重新呈现表单时保留用户的选择。
使用这种方法,您的表单将如下所示:
<%= form_for @my_object do %>
<%= f.select(:priority, options_for_select(['5', '4', '3', '2', '1']),
{},
class: "chzn-select", style: "width: 350px" %>
<% end %>
答案 1 :(得分:0)
您需要传递要选择的动态值。
尝试这样的事情:
<%= form_for(@my_object) do %>
...
<%= f.select(:priority, ['5', '4', '3', '2', '1'], {:selected => params[:my_object][:priority] || '3'}, {:class=>'chzn-select', :style => 'width:350px'}) %>
...
<% end %>
您应该将style
移到CSS文件中。