这行代码是什么来自rails中的form_for方法?
object = record.is_a?(数组)? record.last:record
答案 0 :(得分:2)
首先关闭here is the actual line of code,以及完整的背景信息:
def form_for(record, options = {}, &block)
raise ArgumentError, "Missing block" unless block_given?
html_options = options[:html] ||= {}
case record
when String, Symbol
object_name = record
object = nil
else
object = record.is_a?(Array) ? record.last : record
raise ArgumentError, "First argument in form cannot contain nil or be empty" unless object
object_name = options[:as] || model_name_from_record_or_class(object).param_key
apply_form_for_options!(record, object, options)
end
[...]
end
它说:如果record
是一个数组,则将数组的最后一个元素指定给object
,否则将record
本身指定给object
。
所以基本上,它描述了当你不知道你是要获得一组记录还是只有一条记录时如何处理这个案例。
有几种情况会将数组传递给form_for
。
命名空间路线:
<%= form_for([:admin, @post]) do |f| %>
...
<% end %>
嵌套资源:
<%= form_for([@document, @comment]) do |f| %>
...
<% end %>
请注意,在每种情况下,它都是表单中实际用于的数组中的最后一个元素;较早的元素提供上下文(在命名空间或嵌套上)。更多内容见docs。
答案 1 :(得分:0)
它检查变量record
是否是一个数组,如果是,则获取数组中的最后一个元素,如果它不是获取记录本身。
这对于嵌套路由非常有用,例如,如果您有一个属于User的模型Book,并且在您的路由中嵌套它们:
# config/routes.rb
resources :users do
resources :books
end
然后,对于资源,您需要指定form_for [@user, @book] do |f|
有关嵌套资源的form_for的更多信息:form_for with nested resources
它还使用is_a?方法:http://ruby-doc.org/core-1.9.3/Object.html#method-i-is_a-3F