views:

101

answers:

3

Possible Duplicates:
What is the best way to learn Ruby?
Explain Iterator Syntax on Ruby on Rails

I'm still learning ruby, ruby on rails and such. I'm getting better at understanding all the ruby and rails syntax but this one has me a little stumped.

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

respond_to is a method that takes a proceedure, I think. The two formats look like they may be method calls too, but I don't know.

+2  A: 

I think this post can help you.

Also, take a minute to read the respond_to documentation. It is worth to know that this method has changed in Rails 3.

Without web-service support, an action which collects the data for displaying a list of people might look something like this:

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

Here’s the same action, with web-service support baked in:

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

  respond_to do |format|
    format.html
    format.xml { render :xml => @people.to_xml }
  end
end

What that says is, "if the client wants HTML in response to this action, just respond as we would have before, but if the client wants XML, return them the list of people in XML format." (Rails determines the desired response format from the HTTP Accept header submitted by the client.)

Supposing you have an action that adds a new person, optionally creating their company (by name) if it does not already exist, without web-services, it might look like this:

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

  redirect_to(person_list_url)
end

Here’s the same action, with web-service support baked in:

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
Simone Carletti
+5  A: 

respond_to is a method which takes block. The block takes one argument, which here is called format.

Now you call two methods on format. html which you call without arguments. And xml which you call with a block.

This block takes no arguments and contains a call to the render method with a hash as an argument. The hash contains the key :xml and the value @contact_lists.

sepp2k
+2  A: 

Yeap, you're right.

Ruby method calls are a bit puzzling at first, because you can ommit the parethesis, and they may receive code blocks.

So, this is the explaination:

respond_to do |format| 

Invoke the method respond_to and pass it a block on what to do with the format it will receive.

    format.html # index.html.erb

With that object called format invoke the method html

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

And the method xml which in turns receive another block ( do / en and { } , are different syntax to pass block. )

end

Finish the first block

See this other , other answers.

OscarRyz