Rails的respond_to - 语法分析

时间:2013-08-10 20:42:13

标签: ruby-on-rails ruby

这是一个Rails代码:

respond_to do |format|
  format.html
  format.xml { render :xml => @users }
  format.json { render :json => @users }
end

我知道它的作用。但我不知道命令语法 -wise的含义。

  1. format.xml - 什么是xml,这是一个对象format具有的方法,对吗?我在哪里可以找到它的签名(或描述)?
  2. { } - 一个块或哈希?我认为这是一个障碍。
  3. render - 一种方法?我在哪里可以找到它的签名(在api文档中的位置)?
  4. :xml => @users - 一个哈希,其中:xml =>是一个关键,对吗?
  5. 所以它可以被重新命名为,对吧?:

    respond_to do |format|
      format.html
      format.xml do
        render(:xml => @users)
      end 
      format.json do
        render(:json => @users)
      end
    end
    

2 个答案:

答案 0 :(得分:0)

  1. format来自对方法http://app.com/controller/method.format的请求,其中格式可以是.html.csv等。format.xml的含义仅仅是检查用户是否请求了xml页面(http://app.com/controller/method.xml
  2. 阻止,就像你描述的那样。
  3. 在apidock! http://apidock.com/rails/ActionController/Base/render
  4. 正确,渲染将根据存在的键动作。在您的情况下,由于现有密钥为:xml,因此render方法将输出格式为XML的@users

答案 1 :(得分:0)

格式。*

使用调试器,我了解到formatActionController::MimeResponds::Collector的一个实例。它包含AbstractController::Collector,使用method_missing来响应各种格式调用。

if Mime::SET.include?(mime_constant)
  AbstractController::Collector.generate_method_for_mime(mime_constant)
  send(symbol, &block)
else
  # ...

{render xml:...}

method_missing,很明显它需要一个阻止。

呈现

是的,渲染是一种方法。 Documentation

:xml => @user

是的,这是一个哈希。关键是符号:xml。它也可以写成

render xml: @user

render(xml: @user)

render({xml: @user})
render({:xml => @user})