0

这行代码来自 rails 中的 form_for 方法是做什么的?

object = record.is_a?(Array) ? record.last : 记录

4

2 回答 2

2

首先,这是实际的代码行和完整的上下文:

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 %>

请注意,在每种情况下,它都是表单实际用于的数组中的最后一个元素;较早的元素提供上下文(在命名空间或嵌套上)。更多在文档中。

于 2013-01-26T07:58:47.930 回答
0

它检查变量record是否为数组,如果是,则获取数组中的最后一个元素,如果不是,则获取记录本身。

这对于嵌套路由很有用,例如,如果您有一个属于 User 的模型 Book,并且在您的路由中嵌套它们:

# config/routes.rb

resources :users do
  resources :books
end

然后对于您需要指定的资源form_for [@user, @book] do |f|


有关带有嵌套资源的 form_for 的更多信息:带有嵌套资源的 form_for

它还使用 is_a? 方法:http ://ruby-doc.org/core-1.9.3/Object.html#method-i-is_a-3F

和三元运算符:Ruby 三元运算符没有 else

于 2013-01-26T08:03:13.110 回答