12/08/2018, 15:31

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

0