【问题标题】:Understanding Ruby Syntax [duplicate]了解 Ruby 语法 [重复]
【发布时间】:2011-04-12 09:30:57
【问题描述】:

可能的重复:
What is the best way to learn Ruby?
Explain Iterator Syntax on Ruby on Rails

我还在学习 ruby​​、ruby on rails 等。我对所有 ruby​​ 和 rails 语法的理解越来越好,但是这个让我有点难过。

respond_to do |format|
  format.html # index.html.erb
  format.xml  { render :xml => @contact_lists }
end

respond_to 是一种需要程序的方法,我认为。这两种格式看起来也可能是方法调用,但我不知道。

【问题讨论】:

  • 此外,如果您无意返回 xml 内容,您可以删除整个“respond_to do .. end”部分。代码只会变得更简单。

标签: ruby-on-rails ruby syntax


【解决方案1】:

respond_to 是一个接受阻塞的方法。该块接受一个参数,这里称为format

现在您在format 上调用两个方法。 html 您无需参数即可调用。还有xml,你用一个块来调用它。

此块不接受任何参数,并包含对渲染方法的调用,其中包含一个哈希作为参数。哈希包含键 :xml 和值 @contact_lists

【讨论】:

    【解决方案2】:

    是的,你是对的。

    Ruby 方法调用一开始有点令人费解,因为你可以省略括号,它们可能会收到代码块。

    所以,这就是解释:

    respond_to do |format| 
    

    调用respond_to 方法并传递一个块,告诉它如何处理它将收到的format

        format.html # index.html.erb
    

    使用名为format 的对象调用html 方法

        format.xml  { render :xml => @contact_lists }
    

    xml 方法又接收另一个块( do / en 和 { } 是传递块的不同语法。)

    end
    

    完成第一块

    请参阅this other other 的答案。

    【讨论】:

      【解决方案3】:

      我觉得this post可以帮到你。

      另外,请花一点时间阅读respond_to documentation。 值得知道的是,这个方法有changed in Rails 3

      没有网络服务支持,一个动作 它收集用于显示的数据 人的名单可能看起来有些东西 像这样:

      def index
        @people = Person.find(:all)
      end
      

      这是相同的操作,但 内置网络服务支持:

      def index
        @people = Person.find(:all)
      
        respond_to do |format|
          format.html
          format.xml { render :xml => @people.to_xml }
        end
      end
      

      这就是说,“如果客户 需要 HTML 来响应此操作, 就像我们以前一样回应, 但如果客户端想要 XML,则返回 他们是 XML 中的人员列表 格式。”(Rails 确定所需的 来自 HTTP Accept 的响应格式 客户端提交的标头。)

      假设您有一个添加 一个新人,可以选择创建 他们的公司(按名称)如果没有 已经存在,没有网络服务, 它可能看起来像这样:

      def create
        @company = Company.find_or_create_by_name(params[:company][:name])
        @person  = @company.people.create(params[:person])
      
        redirect_to(person_list_url)
      end
      

      这是相同的操作,但 内置网络服务支持:

      def create
        company  = params[:person].delete(:company)
        @company = Company.find_or_create_by_name(company[:name])
        @person  = @company.people.create(params[:person])
      
        respond_to do |format|
          format.html { redirect_to(person_list_url) }
          format.js
          format.xml  { render :xml => @person.to_xml(:include => @company) }
        end
      end
      

      【讨论】:

      • +1 用于阐明 Ruby 如何确定所需的响应格式!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 2015-09-18
      • 2012-07-07
      • 2012-08-27
      • 2014-01-08
      • 2011-10-14
      相关资源
      最近更新 更多