respond_to trong rails
Nếu không có web_services, một hành động thu thập dữ liệu để hiển thị danh sách những người có thể trông giống như sau: def index @people = User.all end Đây là hành động tương tự, với web_services trong: def index @people = User.all respond_to do |format| format.html ...
Nếu không có web_services, một hành động thu thập dữ liệu để hiển thị danh sách những người có thể trông giống như sau:
def index @people = User.all end
Đây là hành động tương tự, với web_services trong:
def index @people = User.all respond_to do |format| format.html format.xml { render :xml => @people.to_xml } end end
Chú thích: Nếu client bạn muốn trả về ở dạng HTML thì chúng ta có thể chỉ cần cách 1 là OK. để xử lý nhiều thứ cao cấp hơn nữa. ví dụ client muốn nhận dưới dang json hay xml như cách 2 thì ta cần sử dụng đến response cho request thông thường (vơi request XHR thì sẽ có cách khác rất đơn giản mà tôi sẽ nói ở phần sau). Rails sẽ xác định ra định dạng phản hồi mà client yêu cầu trả về khi gửi request
Giả sử bạn có hành động thêm User mới, và có thêm tùy chọn tạo ra một company của họ khi nó chưa tồn tại, không có hỗ chợ từ web-services dưới đây là ví dụ:
def create @company = Company.find_or_create_by_name(params[:company][:name]) @person = @company.people.create(params[:person]) redirect_to(person_list_url) end
nhưng nếu chúng ta cho thêm một chút "gia vị" web-services vào thì nó sẽ trông như thế này:
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
Nếu client muốn trả về HTML, thì phải redirect tới person_list_url, nếu muốn trả về Javascript thì đó chính là một RJS request, và nó sẽ render ra một RJS template tương ứng với action và cuối cùng nếu client muốn nhận dữ liệu dưới dang XML thì sẽ render @person dưới dạng một thêm nữa nó sẽ include company của @person đó sở hữu, nó sẽ có dạng tương tự như sau:
<person> <id>...</id> ... <company> <id>...</id> <name>...</name> ... </company> </person>
tương tự với việc trả về là một json trên đây là một số thứ cần thiết trong việc sử dụng respone_to trong rails