Rails选择助手-默认选择值,如何?


181

这是我现在正在使用的一段代码:

<%= f.select :project_id, @project_select %>

如何修改它使其默认值等于params[:pid]加载页面时的默认值?


我不确定是否要在加载页面时选择默认项目,如果未设置:project_id,还是要将参数哈希中的select值返回为:pid。
Tilendor

Answers:


222

应该这样做:

<%= f.select :project_id, @project_select, :selected => params[:pid] %>

5
没有参数, options_for_select是更好的方法。它适用于任何情况,也适用于表单编辑。
阿德里亚诺·雷森德

这是关键点:在您的函数上查找(options_for_select()与f.select。请记住这些是不同的函数。)
FlyingV

126

使用当前实例的right属性(例如@work.project_id):

<%= f.select :project_id, options_for_select(..., @work.project_id) %>

4
这是最佳答案,因为它也适用select_tag。谢谢,它也确实帮助了我。
stephenmurdoch 2014年

7
您也可以尝试options_for_select(..., f.object.project_id )
18augst 2015年

非常感谢!其他所有接受的答案都没有说明如何通过变量进行选择。
Mike Belanger

52

Rails 3.0.9

select options_for_select([value1, value2, value3], default)

在找出分隔默认值的逗号之前,我注意到值数组周围的value3], default

33

所有这些答案的问题在于,即使您尝试编辑记录,它们也会将字段设置为默认值。

您需要将默认值设置为现有值,然后在没有值的情况下将其设置为实际默认值。像这样:

f.select :field, options_for_select(value_array, f.object.field || default_value)

对于任何不熟悉f.object.field您的人,请始终使用,f.object然后在其末尾添加您的字段名称。


3
这是一个干净的解决方案,并且如上所述,您只想在new上设置默认值,在edit上设置当前值。
COUNT0

1
我知道这是一个旧线程,但对于可能遇到它的任何人,此答案也适用于select2JS插件。如果您要创建或编辑具有相同格式并使用select2的记录,尤其是占位符文本,则可以完美地工作。
cdouble.bhuck

我认为这应该是被接受的答案,就像@Mike Bethany所说的那样,所有其他答案都认为,当rails方法是重用表单时,仅针对新记录呈现该表单。迈克
Erick Castrillo,

22

试试这个:

    <%= f.select :project_id, @project_select, :selected => f.object.project_id %>

使用Rails 4 params[:pid]不能正常工作,但是您的示例可以正常工作。
Eric Wanchic 2013年

这对我有用,因为我在“ f.fields_for”中使用了部分内部语言,谢谢。
雨果

11

如果params [:pid]是一个字符串,如果它来自表单,则可能需要使用

params[:pid].to_i  

在选择列表中选择正确的项目


这个答案帮助我查明了我的问题。我的选择框是动态的,正在从数据库中提取集合。我试图用标题而不是项目的ID填充默认选择。这个答案帮助我看到了这个问题,当我@project用数据库表中的ID(而不是标题)填充变量后,此代码便附加在form.select助手的后面:selected: @project谢谢@danengle
Christopher Warrington

10

我找到了解决方案,并且发现我对RoR完全没有经验。

在上述管理视图的控制器内添加以下内容:

@work.project_id = params[:pid] unless params[:pid].nil?

7
<%= f.select :project_id, @project_select, :selected => params[:pid] %>

3

我无法使它正常工作,发现我不仅需要将“ selected” html属性添加到正确的<option>标签,而且需要添加到<select>标签。MDN关于select标记的selected属性的文档说:

selected-布尔值属性指示可以初始选择特定选项。

这意味着代码应如下所示:

f.select :project_id, options_for_select(@project_select, default_val), html: {selected: true}

2
<%= f.select :project_id, options_from_collection_for_select(@project_select,) %>

0

另外,您可以在控制器中设置:project_id属性,因为f.select的第一个参数提取该特定属性。


0

如果尝试打印f对象,则将看到可以探测到f.object以获取所选项目(适用于所有2.3以上的rails)

logger.warn("f #{f.object.inspect}")

因此,请使用以下脚本来获取正确的选定选项:

:selected => f.object.your_field 

0

它已经解释了,将尝试举一个例子

让选择列表成为

select_list = { eligible: 1, ineligible: 0 }

所以下面的代码导致

<%= f.select :to_vote, select_list %>

<select name="to_vote" id="to_vote">
  <option value="1">eligible</option>
  <option value="0">ineligible</option>
</select>

因此,要使选项默认为选中状态,我们必须使用selected:value

<%= f.select :to_vote, select_list, selected: select_list.can_vote? ? 1 : 0 %>

如果可以 如果返回true,则它设置为selected:1选择第一个值,否则选择第二个值。

select name="driver[bca_aw_eligible]" id="driver_bca_aw_eligible">
  <option value="1">eligible</option>
  <option selected="selected" value="0">ineligible</option>
</select>

如果选择选项只是一个数组列表而不是hast,则被选择的将只是要选择的值,例如

select_list = [ 'eligible', 'ineligible' ]

现在选择的只是

<%= f.select :to_vote, select_list, selected: 'ineligible' %>

0

Mike Bethany的上述回答是在创建新记录时设置默认值,并且仍将用户选择的值显示在编辑表单中。但是,我添加了模型验证,但不允许我提交表单。这是在现场进行模型验证并显示默认值以及用户在编辑模式下选择的值的方法。

  <div class="field">
    <%= f.label :project_id, 'my project id', class: "control-label" %><br>
    <% if @work.new_record? %>
      <%= f.select :project_id, options_for_select([['Yes', true], ['No', false]], true), {}, required: true, class: "form-control" %><br>
    <% else %>
      <%= f.select :project_id, options_for_select([['Yes', true], ['No', false]], @work.project_id), {}, required: true, class: "form-control" %><br>
    <% end %>
  </div>

模型验证

  validates :project_id, presence: true

-2

这应该为您工作。它只是传递{:value => params[:pid] }给html_options变量。

<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>

但它不会在select:S
totocaster
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.