如何从Rails Controller操作中操作响应状态代码

时间:2011-02-27 09:40:08

标签: ruby-on-rails

给出经典的控制器动作。看看MARK。我需要为响应设置状态代码为200。背景:swfupload ajax文件上传解决方案似乎以错误的格式发送数据。

我尝试了response.headers ['Status'] = 200,response.status 200,render:json => 'data',:status => 200.但是响应的状态代码没有改变。

def create
  if params[:Filedata]
    @medium = Medium.new(:swf_uploaded_data => params[:Filedata])
  else
    @medium = Medium.new(params[:medium])
  end

  respond_to do |format|      
    if @medium.save  
      format.html { redirect_to(@medium, :notice => 'Medium was successfully created.'); }
      format.xml  { render :xml => @medium, :status => :created, :location => @medium; }        
      MARK
    else
      format.html { render :action => "new" }
      format.xml  { render :xml => @medium.errors, :status => :unprocessable_entity }
    end
  end
end

2 个答案:

答案 0 :(得分:5)

状态代码只能在render,redirect_to等返回命令中声明,并且会影响到这个返回命令,没有办法为所有响应设置代码

对于format.html { redirect_to(@medium, :notice => 'Medium was successfully created.'); },因为是重定向,代码将是3XX,您无法更改或重定向无法正常工作

对于format.xml { render :xml => @medium, :status => :created, :location => @medium; },您声明状态为已创建,这意味着对于代码为201的rails,将其更改为200:

format.xml { render :xml => @medium, :status => :ok, :location => @medium; }

答案 1 :(得分:0)

AJAX调用期望采用什么格式?你只是回应HTML和XML,所以如果它需要JavaScript或JSON,那可能是个问题。

另外,我不确定这是否重要,但我从未在respond_to区块中看到过如你所示的情况。通常就是这样:

if @medium.save
  respond_to { |format| ... }
else
  respond_to { |format| ... }
end

我也不清楚“MARK”应该是什么。