我正在浏览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 Plans
,Plan
属于User
),我想要在语法和为什么?
编辑1:此外,如果您在form_helper
或常规表单中解释它是如何工作的,那将会非常棒。想象一下,您正在向了解Web开发的Web开发人员解释这一点,但对Rails来说是“相对较新的”。你会如何解释它?
答案 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
语法。