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

时间:2013-01-26 07:51:09

标签: ruby-on-rails ruby

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

  

object = record.is_a?(数组)? record.last:record

2 个答案:

答案 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

三元运算符:Ruby ternary operator without else