2010-09-14 44 views
3

可能重複:
What is the best way to learn Ruby?
Explain Iterator Syntax on Ruby on Rails理解的Ruby語法

我還在學習Ruby,Ruby on Rails和這樣。我在理解所有Ruby和Rails語法方面越來越好,但是這個讓我有點難過。

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

respond_to是一種採取程序的方法,我認爲。這兩種格式看起來像他們也可能是方法調用,但我不知道。

+1

此外,如果您無意返回xml contant,則可以刪除整個「respond_to do .. end」部分。代碼只會變得更簡單。 – 2010-09-14 21:28:12

回答

6

respond_to是一種取塊的方法。該塊有一個參數,這裏稱爲format

現在您在format上調用兩種方法。 html你不帶任何參數地調用。和xml你用塊調用。

此塊不接受任何參數,幷包含對使用散列作爲參數的render方法的調用。散列包含密鑰:xml和值@contact_lists

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 

什麼,說是,「如果客戶想要 HTM L響應此動作, 只是我們之前的迴應, 但如果客戶端需要XML,則返回 他們的XML 格式的人員列表。「 (Rails的確定從HTTP所需 響應格式接受客戶端提交的 頭。)

假如你有將一個動作 一個新的人,可選擇創建 他們的公司(按名稱),如果它不 已經存在,沒有網絡的服務, 它可能是這樣的:

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 
+0

+1,用於闡明Ruby如何確定所需的響應格式! – 2011-04-20 03:53:25

4

Yeap,你說得對。

Ruby方法的調用起初有點令人費解,因爲你可以忽略這個parethesis,並且它們可能會接收到代碼塊。

所以,這是交代:

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 otherother的答案。