2013-01-21 45 views
3

我使用腳手架爲帖子創建了CRUD系統。在控制器中,我看到:瞭解Ruby/Rails中的塊

class PostsController < ApplicationController 
    # GET /posts 
    # GET /posts.json 
    def index 
    @posts = Post.all 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @posts } 
    end 
    end 
  • 什麼是respond_to和它從何而來?由於它使用的是運算符do,因此我假設它是某種可迭代列表。在該列表中的每個format上,它將執行htmljson方法。

  • { render json: @posts }json方法有什麼關係?是否將render json: @posts作爲該方法的參數傳遞?每個對象是renderjson?我從來沒有見過在符號之外使用冒號符號。

回答

3
  1. PostsController的ApplicationController的ApplicationController繼承繼承方法從的ActionController :: Base的。這就是responds_to的來源。值得研究的主題是「方法查找」。
  2. do ... end是編寫塊的一種方式。 { render json: @posts }是另一種方式。
  3. json: "foo"是一個更現代的替代書寫:json => "foo"
  4. format是你做飯直到塊內使用任意變量。 render是一種方法,:json是一個符號。 respond_to將響應Rails格式響應的用戶請求。
  5. 對了解方法,也是這樣:

http://apidock.com/rails/ActionController/MimeResponds/InstanceMethods/respond_to

如果你想看看source(這是一個有點厚),例如在保羅提到的respond_with方法,這是在Rails的源位置:

軌/ ActionPack的/ lib目錄/ action_controller /金屬/ mime_responds.rb

+0

謝謝,這非常有幫助。在Ruby語法中,似乎只有很多方法可以實現同樣的功能,而我不習慣每種方式來閱讀。 –

1

首先,respond_to在Rails中不是現代的東西。但我仍然會提供reference來解釋。

更現代的幫手是respond_with

可能這個screencast對您有用。

+0

感謝視頻,我會給它看。那麼你認爲主網站上的博客教程已經過時了嗎?我應該打擾繼續嗎? –

+0

你的意思是什麼主網站?它是http://guides.rubyonrails.org/? –

+0

http://guides.rubyonrails.org/getting_started.html –