有人可以用清晰简单的术语向我解释collection_select吗?

时间:2012-01-18 09:31:22

标签: ruby-on-rails ruby-on-rails-3

我正在浏览collection_select的Rails API文档,它们太可怕了。

标题是:

collection_select(object, method, collection, value_method, text_method, options = {}, html_options = {})

这是他们提供的唯一示例代码:

collection_select(:post, :author_id, Author.all, :id, :name_with_initial, :prompt => true)

有人可以解释,使用简单的关联(例如User has_many PlansPlan属于User),我想要在语法和为什么?

编辑1:此外,如果您在form_helper或常规表单中解释它是如何工作的,那将会非常棒。想象一下,您正在向了解Web开发的Web开发人员解释这一点,但对Rails来说是“相对较新的”。你会如何解释它?

2 个答案:

答案 0 :(得分:271)

collection_select(
    :post, # field namespace 
    :author_id, # field name
    # result of these two params will be: <select name="post[author_id]">...

    # then you should specify some collection or array of rows.
    # It can be Author.where(..).order(..) or something like that. 
    # In your example it is:
    Author.all, 

    # then you should specify methods for generating options
    :id, # this is name of method that will be called for every row, result will be set as key
    :name_with_initial, # this is name of method that will be called for every row, result will be set as value

    # as a result, every option will be generated by the following rule: 
    # <option value=#{author.id}>#{author.name_with_initial}</option>
    # 'author' is an element in the collection or array

    :prompt => true # then you can specify some params. You can find them in the docs.
)

或者您的示例可以表示为以下代码:

<select name="post[author_id]">
    <% Author.all.each do |author| %>
        <option value="<%= author.id %>"><%= author.name_with_initial %></option>
    <% end %>
</select>

FormBuilder中没有记录,但FormOptionsHelper

中没有记录

答案 1 :(得分:18)

我自己花了很多时间在select标签的排列上。

collection_select从一组对象构建一个select标签。记住这一点,

object:对象的名称。这用于生成标记的名称,用于生成选定的值。这可以是实际对象或符号 - 在后一种情况下,该名称的实例变量为looked for in the binding of the ActionController(即:post在您的查找名为@post的实例var控制器。)

method:方法的名称。这用于生成标记的名称。换句话说,您尝试从选择中获取的对象的属性

collection:对象集合

value_method:对于集合中的每个对象,此方法用于值

text_method:对于集合中的每个对象,此方法用于显示文本

可选参数:

options:您可以传递的选项。这些文件记录为here,标题为选项。

html_options:无论在这里传递什么,只需添加到生成的html标记中。如果你想提供一个类,id或任何其他属性,它就在这里。

您的关联可以写成:

collection_select(:user, :plan_ids, Plan.all, :id, :name, {:prompt => true, :multiple=>true })

关于使用form_for,再次以非常简单的术语,对于form_for内的所有标记,例如。 f.text_field,您不需要提供第一个(object)参数。这取自form_for语法。