【发布时间】:2013-01-10 04:41:53
【问题描述】:
这行代码是从rails中的form_for方法做的吗?
object = record.is_a?(Array) ? record.last : 记录
【问题讨论】:
标签: ruby-on-rails ruby
这行代码是从rails中的form_for方法做的吗?
object = record.is_a?(Array) ? record.last : 记录
【问题讨论】:
标签: ruby-on-rails ruby
首先,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。
【讨论】:
它检查变量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
【讨论】: