如果设置了 cookie,如何在我的 select 菜单中预 select 一个值?

HOw do I pre-select a value in my select menu if a cookie is set?

我正在使用 Rails 4.2.3。我的页面中有这个 select 表单域……

<%= f.label :object %><br>
<div class="styled-select"><%= collection_select(:user_object, :object, @objects, :id, :description, {:prompt => true}) %></div>

我的问题是,如果存在名为“object”的 cookie,我该如何预先 select 一个值?我想将 select 菜单的值设置为 cookie 的值。请注意,如果此视图由我的控制器的“索引”操作提供服务,我只想预 select 值(以上是不同控制器方法提供的部分视图的一部分)。

谢谢,-戴夫

如果你想让某个对象被默认选中,你可以使用:selected

假设您的 cookie 对象存储一个 id

{:selected => object}

<%= collection_select(:user_object, :object, @objects, :id, :description, {:prompt => true}, {:selected => object} ) %>

在您的索引控制器中获取 cookie 值,

def index
  @selected_object = cookies[:some_key] 
end

在你的Index.html.erb

<div class="styled-select"><%= collection_select(:user_object, :object, @objects, :id, :description, {:prompt => true}, {selected: <%= @selected_object %> }) %></div>

或者您可以从查看文件中即时获取该 cookie,

<div class="styled-select"><%= collection_select(:user_object, :object, @objects, :id, :description, {:prompt => true}, {selected: <%= cookies[:some_key] %> }) %></div>

请注意,cookie 的值可能是哈希值,请确保您获得正确的值,您也可以在控制器中使用条件来避免获得 nil 并导致在 view by 中未选择任何值,

def index
  @selected_object = cookies[:some_key]
  if @selected_object.nil?
    @selected_object = "default_selected"
  end
end

如果您希望默认选择某个对象,请务必使用其 id,而不是整个对象。

尝试以下操作:

<%= f.collection_select(:user_object,:object,@objects ,:id, :description,:selected => cookies[:object])%>

Note: Make sure cookies[:object] returns an id of the items in the select list

来源 - http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/collection_select#632--selected

我喜欢用options_for_select。 select 的选项可以采用数组或二维数组,在后一种情况下,第一个值显示给用户,第二个值保存。它还可以采用可选的第二个参数,select 是默认值:

if cookies[:whatever_key_is]
  <%= f.select(:object, options_for_select(["array", "of", "options"], cookies[:whatever_key_is]) %>
end

我通常编写一个传递数组的方法,尤其是二维数组,然后将该方法作为第一个参数调用。我其实也经常为第二个参数写一个方法。

嘿,根据 APIdock 上的文档:

collection_select(:post, :author_id, Author.all, :id, :name_with_initial, {:selected => current_book.authors.map(&:id)})

所以你应该这样写:

在你的控制器中指定你的对象:@selected = cookies[:some_key]

collection_select(:user_object, :object, @objects, :id, :description, {:selected => @selected.map(&:id), :prompt => true})

您不需要整个对象,只需要 ids 来检查选定的对象。我认为这应该可以解决问题。