在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运算符?
由于
答案 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方法 发送回来:创建 状态和:新的位置 创建资源
- 否则,请发回:没有身体的确定回复
来自documentation的to_format
部分:
首先我们尝试渲染模板,如果 模板不可用,我们 验证资源是否响应 :to_format并显示它。
还有一个关于它的Railscast: http://railscasts.com/episodes/224-controllers-in-rails-3