【问题标题】:what does this line of code from form_for method in rails do?rails 中 form_for 方法的这行代码有什么作用?
【发布时间】:2013-01-10 04:41:53
【问题描述】:

这行代码是从rails中的form_for方法做的吗?

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

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    首先,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

    【讨论】:

      【解决方案2】:

      它检查变量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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-03
        • 2010-11-07
        • 1970-01-01
        相关资源
        最近更新 更多