RoR返回406不可接受,请求HTML

时间:2012-09-25 17:22:24

标签: ruby-on-rails ruby-on-rails-3.1

我的问题是,当我试图在名为“clients”的控制器中处理更新操作时,我得到406不可接受(我正在请​​求HTML而不是处理JSON)我的预感是我在结构中遗漏了一些东西我的嵌套if语句,因为只有在下面列出的一个嵌套进程的验证失败时才会发生这种情况。我已经通过我的代码并尝试了几种重构,但似乎无法解决这个问题。希望一双新鲜的眼睛可以看到一些我不喜欢的东西。

def update
@client = Client.find(params[:id])



respond_to do |format|
if params[:save_contact]
    format.html { redirect_to "/clients/#{@client.id}/edit#tabs-3", :notice => 'Contact Saved!' }
    format.mobile { render :action => "edit", :notice => 'Contact Saved' }
    format.json { head :ok }
else
end
if params[:save_job]
    format.html { redirect_to "/clients/#{@client.id}/edit#tabs-6", :notice => 'Job Saved!' }
    format.mobile { render :action => "edit", :notice => 'Job Saved' }
    format.json { head :ok }

else
end




if @client.update_attributes(params[:client])
 @client.update_attribute(:branch_number, @client.branch.number)         

    if @client.wcrequested? && !@client.wcrequest_sent?
          @client.update_attribute(:wcstatus, "Pending")
          @client.update_attribute(:wcrequest_sent, "TRUE")
          @client.update_attribute(:wcresponse_sent, "FALSE")
          @client.update_attribute(:wcresponded, "FALSE")
          ClientsMailer.wcreq_recieved_corp(@client, current_user).deliver
          ClientsMailer.wcreq_recieved_branch(@client, current_user).deliver
    else
      format.html { render :action => "edit" }
      format.mobile { render :action => "edit" }
      format.json { render :json => @client.errors, :status => :unprocessable_entity }


    end

    if @client.wcstatus == "Denied"
           @client.update_attribute(:wcrequest_sent, "FALSE")
           @client.update_attribute(:wcrequested, "FALSE")
           ClientsMailer.wcreq_completed_corp(@client, current_user).deliver
           ClientsMailer.wcreq_completed_branch(@client, current_user).deliver
    else
    end

    if @client.wcresponded? && !@client.wcresponse_sent?
          @client.update_attribute(:wcresponse_sent, "TRUE")
          ClientsMailer.wcreq_completed_corp(@client, current_user).deliver
          ClientsMailer.wcreq_completed_branch(@client, current_user).deliver
    else
    end

    if params[:gpreq]
          @client.update_attribute(:gpstatus, "Pending GP Approval")
          ClientsMailer.gpreq_recieved_corp(@client, current_user).deliver
          ClientsMailer.gpreq_recieved_branch(@client, current_user).deliver
    else
    end
    if params[:gpreply]
          @client.update_attribute(:gpstatus, "GP Approval Completed")
          ClientsMailer.gpreq_completed_corp(@client, current_user).deliver
          ClientsMailer.gpreq_completed_branch(@client, current_user).deliver
   else
   end

    if @client.cred_requested? && !@client.cred_req_sent?
          @client.update_attribute(:cred_req_sent, "TRUE")
          ClientsMailer.credreq_recieved_corp(@client, current_user).deliver
          ClientsMailer.credreq_recieved_branch(@client, current_user).deliver
   else
   end
    if @client.cred_status == "Completed" && !@client.cred_rep_sent?
          @client.update_attribute(:cred_rep_sent, "TRUE")
          ClientsMailer.credreq_completed_corp(@client, current_user).deliver
          ClientsMailer.credreq_completed_branch(@client, current_user).deliver
  else
  end



      format.html { redirect_to edit_client_path(@client), :notice => 'Client was successfully updated!' }
      format.mobile { render :action => "edit", :notice => 'Client was successfully updated!' }
      format.json { head :ok }
      format.xml { render :action => "edit"}

else

      format.html { render :action => "edit" }
      format.mobile { render :action => "edit" }
      format.json { render :json => @client.errors, :status => :unprocessable_entity }
      format.xml { render :action => "edit"}


end
end
   end

2 个答案:

答案 0 :(得分:0)

我想我明白了。 format param与其他param不同:rails使用Accept Headers和:format param来确定是否使用html,xml,json或其他不同的东西进行响应。所以我说你不支持你尝试使用的所有格式,可能mobile就是原因。

答案 1 :(得分:0)

406错误是由相关格式无法提供或照顾的。

我建议你首先将操作削减到一个respond_to块,然后将业务逻辑移到模型中。 @client.update_attribute(:wcstatus, "Pending")之类的内容不应该在控制器中,而应该在验证模型中,然后调用save方法。

我怀疑你的if else end语句没有满足你的条件。 BTW其他紧接着就结束了是完全错误的。

无论如何,将其删除,然后查看离开yiu的位置,然后逐个添加onditions直到您遇到问题,注意使用条件设置局部变量并仅保留一个使用本地的respond_to块重定向的变量等......