Rails在控制器中响应

时间:2013-03-05 06:18:32

标签: ruby-on-rails ruby-on-rails-3

这是来自互联网的代码,我无法理解控制器中的respond_to,format.html和format.js做了什么。

def create
 @review = Review.create!(params[:review])
 flash[:notice] = "Thank you for reviewing this product"
  respond_to do |format|
   format.html { redirect_to @review.product }
   format.js
 end
end

感谢您的时间。

拉​​姆亚

1 个答案:

答案 0 :(得分:0)

respond_to(* types,& block)public 如果没有Web服务支持,收集用于显示人员列表的数据的操作可能如下所示:

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

以下是相同的操作,其中包含了Web服务支持:

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

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

这就是说,“如果客户希望HTML响应此操作,只需像以前一样回复,但如果客户端需要XML,则返回XML格式的人员列表。” (Rails根据客户端提交的HTTP Accept标头确定所需的响应格式。)

假设您有一个添加新人的操作,可选择创建他们的公司(按名称),如果它不存在,没有Web服务,它可能如下所示:

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

    redirect_to(person_list_url)
  end

以下是相同的操作,其中包含了Web服务支持:

  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

如果客户想要HTML,我们只需将它们重定向回人员列表。如果他们想要Javascript(format.js),那么它是一个RJS请求,我们渲染与此操作相关的RJS模板。最后,如果客户端需要XML,我们将创建的人员呈现为XML,但有一个转折点:我们还将人员的公司包含在呈现的XML中,因此您可以得到如下内容:

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