有没有人能用简单明了的术语给我解释一下 Collection_select?

我正在浏览 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)

有人能用一个简单的关联来解释一下我想在语法中使用什么吗? 为什么?

编辑1: 另外,如果你能解释它在 form_helper或者常规表单中是如何工作的,那就太棒了。想象一下,你正在向一个了解 web 开发,但对 Rails 来说“相对较新”的 web 开发人员解释这个问题。你怎么解释?

65984 次浏览
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中有记载

我自己也花了相当长的时间在选择标签的排列上。

collection_select从一组对象中构建一个 select 标记,

object: 对象的名称。这用于生成标记的名称,并用于生成选定的值。这可以是一个实际的对象,也可以是一个符号——在后一种情况下,该名称的实例变量是 ActionController的结合中寻找(也就是说,:post在您的控制器中查找一个名为 @post的实例变量)

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

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,您不需要提供第一个(object)参数。这是从 form_for语法中获取的。