在rails 3中为ajax vs html请求渲染不同的操作

时间:2011-02-03 18:57:08

标签: ruby-on-rails ajax ruby-on-rails-3 redirect render

在rails 3中,我在照片控制器中使用以下代码进行销毁操作

 def destroy
      @photo = Photo.find(params[:id])
     if @photo.destroy
       flash[:notice] = t('photo.deleted')
       respond_to do |format|
         if request.xhr?
           format.js
         else
           format.html {redirect_to photos_path}
         end
       end
     else
       flash[:alert] = t('.photo.error_deleting')
       if request.xhr?
         redirect_to(photos_url)
       else
         redirect_to(photo_path @photo)
       end
     end
   end

如果从标准链接调用此目标,则目标主要是重定向到索引页面;如果从远程链接调用,则渲染destroy.js。 这有效,但我想知道是否有更简洁的方法在rails 3中这样做。可能使用respond_with运算符?

由于

1 个答案:

答案 0 :(得分:3)

这应该适合你:

respond_to :html, :js

def destroy
  @photo = Photo.find(params[:id])
  if @photo.destroy
    flash[:notice] = t('photo.deleted')
  else
    flash[:alert] = t('.photo.error_deleting')
  end

  respond_with(@photo)
end

这里有一篇很好的博客文章: http://ryandaigle.com/articles/2009/8/10/what-s-new-in-edge-rails-default-restful-rendering

这是关于逻辑的帖子的引用:

  

如果要求:html格式:

     
      
  • 如果是GET请求,请调用render(将显示视图)   当前行动的模板)
  •   
  • 如果是POST请求且资源有验证错误,请渲染   :new(所以用户可以修复他们的   误差)
  •   
  • 如果是PUT请求并且资源有验证错误,则渲染   :编辑(这样用户可以修复他们的   误差)
  •   
  • 否则,重定向到资源位置(即user_url)
  •   
     

如果请求了其他格式,(例如:xml或:json)

     
      
  • 如果是GET请求,请在资源上调用:to_format方法   发送回来
  •   
  • 如果资源有验证错误,请发回错误   请求格式与   :unprocessable_entity状态代码
  •   
  • 如果是POST请求,请在资源上调用:to_format方法   发送回来:创建   状态和:新的位置   创建资源
  •   
  • 否则,请发回:没有身体的确定回复
  •   

来自documentationto_format部分:

  

首先我们尝试渲染模板,如果   模板不可用,我们   验证资源是否响应   :to_format并显示它。

还有一个关于它的Railscast: http://railscasts.com/episodes/224-controllers-in-rails-3

相关问题