如果设置了cookie,我会在我的选择菜单中预先选择一个值吗?

时间:2016-02-26 01:59:12

标签: ruby-on-rails cookies select-menu

我正在使用Rails 4.2.3。我的页面中有这个选择表单字段...

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

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

谢谢, - 戴夫

5 个答案:

答案 0 :(得分:0)

如果您希望默认选择某个对象,可以使用:selected

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

{:selected => object}

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

答案 1 :(得分:0)

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

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        let senderButton = sender as! UIButton

        if segue.identifier == "showDetailasDetail" {
            let vc = segue.destinationViewController as! InfoPopupVC
            vc .currentEvent = posts[senderButton.tag]
        }
}

在Index.html.erb

def index
  @selected_object = cookies[:some_key] 
end

或者您可以从View文件中快速获取该Cookie,

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

请注意,cookie的值可能是哈希值,请确保您获得正确的值,您也可以在控制器中使用条件来避免获取nil并且不会在视图中选择任何值,

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

答案 2 :(得分:0)

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

尝试以下方法:

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

注意:   确保 cookies [:object] 返回选择列表中项目的 id

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

答案 3 :(得分:0)

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

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

我通常会编写一个传递数组的方法,特别是如果它是二维的,然后将该方法作为第一个参数调用。实际上我通常也会为第二个参数编写一个方法。

答案 4 :(得分:0)

嘿,根据APIdock的文件:

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

所以你应该这样写:

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

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

您不需要整个对象,只需ids即可查看所选对象。我认为这应该可以解决问题。