有人可以用简单明了的方式向我解释collection_select吗?


146

我正在浏览Rails API文档collection_select,他们真是糟糕透顶。

标题是这样的:

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)

有人可以使用简单的关联(例如Userhas_many Plans和a Plan属于a User)来解释我要在语法中使用什么,为什么?

编辑1:而且,如果您解释了它在form_helper常规格式或常规格式中的工作原理,那将是很棒的。想象一下,您正在向了解Web开发但对Rails“相对较新”的Web开发人员进行解释。您将如何解释?


50
是。那是我所见过的最糟糕的文档
Jaseem 2012年

1
为了公平起见,该文件是相当确定的,只是没有在FormBuilder,但在FormOptionsHelperapi.rubyonrails.org/classes/ActionView/Helpers/...
amiuhle

1
我最喜欢的部分是当您以某种形式使用collection_select并更改整个签名时,该对象不是参数列表的一部分,而是将collection_select用作对象上的方法。不要以为他们在文档中提到了这一点...
user3670743

1
这是一个开源项目:如果文档不多,我们只能责怪自己;如果我们尽我们所能做得更好,那将是惊人的。小型/简单的公关大有帮助。
BKSpurgeon

Answers:


305
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


32
这很容易,这是我所见过的复杂的Rails结构的最佳解释之一。您使用了清晰的语言以及基本的Rails构造来巩固它。非常感谢!!
marcamillion

2
为什么将其命名为“ post [author_id]”?
Jaseem

@alexkv谢谢-您能否详细说明:post,#字段名称空间和:author_id,#字段名称参数(前两个)的意义-我不了解它们在事物方案中的用途-可以吗?他们被忽略了吗?
BKSpurgeon '16

1
第一个参数确实可以为零。如果要创建对象表单,它将是该对象,以便选择对象具有与表单其余部分相同的命名空间。如果不需要,将1st保留为nil。第二个是控件的名称,因此,如果要更新对象上的字段(第一个参数),则该字段名称是第二个参数。如果您要为其他用途制作某种形式,则第二个参数就是您希望对形式控件进行命名和标识的内容。为什么要与nil 1st一起使用?可能是因为您想要collection_select作为:prompt选项。
elc

1
我还应该注意,使用options_for_select可以将提示参数附加到select_tag上,其效果可能与使用nil对象的collection_select相同。
elc

21

我本人花了很多时间在选择标签的排列上。

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

object:对象名称。这用于生成标签的名称,并用于生成选定的值。它可以是实际对象,也可以是符号-在后一种情况下,该名称的实例变量在的绑定中ActionController:post查找(即,@post在控制器中查找实例var )。

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

collection :对象的集合

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

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

可选参数:

options:您可以通过的选项。这些都记录在此处的标题下。

html_options:无论此处传递的是什么,只需将其添加到生成的html标签中即可。如果要提供类,id或任何其他属性,请在此处输入。

您的关联可以写为:

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

关于使用form_for,再次以非常简单的方式,针对内的所有标签form_for,例如。f.text_field,则无需提供first(object)参数。这是从form_for语法中获取的。


2
感谢您抽出宝贵的时间...虽然,老实说,唯一的问题是您的解释无助于澄清我的脑海。您在实际定义中使用了很多术语。非常感谢您抽出宝贵的时间-为此,我投了赞成票。
marcamillion

4
由于marcamillion如此明确地指出了原因,我投了反对票。
杰米
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.