【问题标题】:Rails: Preselect a value in ActionView-Helper 'collection_select'Rails:在 ActionView-Helper 'collection_select' 中预选一个值
【发布时间】:2010-11-04 08:47:51
【问题描述】:

我正在尝试让ActionView-Helper collection_select 获取将在下拉菜单中预先选择的值。

两者都不是(html-option-hash 中的:selected

<%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected => @my_collection_object.id}) %>

也不(:selected 在选项哈希中)

<%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {:selected => @my_collection_object.id}, {}) %>

似乎有效。

我做错了什么?谁能帮我解决这个问题?

【问题讨论】:

    标签: ruby-on-rails actionview actionviewhelper


    【解决方案1】:

    如果您的集合是 2 值数组的形式,它也可以工作:

    CURRENCIES = [["USD", "$"], ["BRL", "R$"]]
    
    <%= collection_select :thing, :currency, CURRENCIES, :first, :last %>
    

    :first:last 技巧非常适用于这些东西,无需为它们定义单独的模型。

    【讨论】:

    • 不回答关于如何选择某个值的问题
    【解决方案2】:

    使用:selected_value

    %= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected_value => @my_collection_object.id}) %>
    

    【讨论】:

      【解决方案3】:

      来自docs

      示例用法(为Post@post 的实例选择关联的Author):

      collection_select(:post, :author_id, Author.all, :id, :name_with_initial)
      

      如果@post.author_id 已经为 1,则返回:

      <select name="post[author_id]">
        <option value="">Please select</option>
        <option value="1" selected="selected">D. Heinemeier Hansson</option>
        <option value="2">D. Thomas</option>
        <option value="3">M. Clark</option>
      </select>
      

      所以您只需要确保@my_object.my_method 返回一个与可用选项值之一匹配的值。如果有匹配项,则会选择该选项。

      【讨论】:

      • 我接受了这个答案,虽然我只是注意到我必须从 collection_select 切换到 select。我有两个集合选择来选择两个不同的“post.author_id”(使用上面的例子),所以我可以在页面上比较它们。我在每个collection_selects 上都有一个javascript-observer,但它不起作用,因为collection_selects 总是输出以下html-element-id:post_author_id。我的实现不起作用,因为这两个 collection_select 的 html-element-id 是相同的。
      • 是的,Rails 不保证唯一元素 ID 这一事实有点问题。
      【解决方案4】:

      检查 @my_object.my_method 是否返回 nil。如果是的话,

      如果调用方法返回 nil,则在选项哈希中不包含 :prompt 或 :include_blank 时不会进行选择。

      除此之外,您可以尝试使用 lambda,就像在 rdoc 示例中一样

      {:disabled => lambda {|category| category.archived? }
      

      在你的情况下,这看起来像

      {:selected => lambda {|obj| obj.id == @my_collection_object.id }}
      

      【讨论】:

        【解决方案5】:

        根据docs,如果@my_object.my_method与选项之一的值相同,则默认选择该选项。

        相反,您可以尝试将options_from_collection_for_selectselect_tag 结合使用:

        <%= select_tag 'my_object[my_method]', options_from_collection_for_select(@my_collection, :id, :description_string, @my_collection_object.id) %>
        

        【讨论】:

          猜你喜欢
          • 2016-05-14
          • 1970-01-01
          • 2014-06-25
          • 2014-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-10
          相关资源
          最近更新 更多