Rails选择Box作为固定值

时间:2014-09-01 09:56:37

标签: ruby-on-rails select ruby-on-rails-4

我希望有一个固定的选择框,它提供1到5的选项。其中3是页面加载时的默认值。

<%= f.select(:priority, ['5', '4', '3', '2', '1'], {:selected => '3'}, {:class=>'chzn-select', :style => 'width:350px'}) %>

现在当有人选择4并提交表单时,如果表单验证错误并显示表单,则应保留该值。

我的代码似乎在提交表单后零售价值,并且有验证错误。

2 个答案:

答案 0 :(得分:1)

当您使用form_for包装对象时,设置到该对象的值将显示在表单字段中。所以你应该自动获得你想要的行为。问题似乎是您通过在帮助程序中设置selected选项来覆盖该行为,该选项是对html中的select元素进行硬编码。

选项1

使用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尚未初始化时使用。

选项2

另一个(好)选项是不在视图中设置默认选定值,而是在初始化对象时在控制器中设置:

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文件中。