带有POST功能的Rails ajax:为什么模板丢失了?

时间:2014-04-05 09:57:42

标签: jquery ruby-on-rails ajax

我正在使用ajax提交完成头像上传和裁剪。

我通过ajax发送base64图像,然后将图像转换为carrierwave。

一切正常,除了ajax响应:模板丢失。

这是我的ajax电话:

$.ajax({
  type: "post",
  dataType: "json",
  url: "/profile/update_avatar",
  data: { image: canvas.toDataURL() }
})
.done(function(data) {

  // You can pull the image URL using data.url, e.g.:
  $('.user-image').html('<img src="'+data.url+'" />');

});

这是我的控制者:

def update_avatar
respond_to do |format|
  if current_user.update_cropped_avatar(params[:image])
    format.js
    format.html { render :nothing => true, :notice => 'Update SUCCESSFUL!' }
  else
    format.html { render :action => "edit" }
    format.json { render :json => current_user.errors, :status => :unprocessable_entity }
  end
end

我不需要渲染模板......但错误是:

Missing template profiles/update_avatar, application/update_avatar with {:locale=>[:it], :formats=>[:js, :html], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :haml]}. 

为什么?

2 个答案:

答案 0 :(得分:10)

问题在于您的使用:

respond_to do |format|
    format.js

我知道您已将JSON发送给Rails,但是当您的头像正确发送时,您似乎只处理标准script dataType。您对format.js的使用基本上导致rails在action_name.js.erb文件夹中查找views - 因此您的模板错误

有很多方法可以解决这个问题,包括:

respond_to do |format|
    format.js { render nothing: true } 

<强>修正

在与罗伯托聊天时,这对他有用:

def update_avatar 
    respond_to do |format| 
        if current_user.update_cropped_avatar(params[:image]) 
            format.json { render :json => current_user.profile.avatar_url, :status => 200 } 
            format.html { render :nothing => true, :notice => 'Update SUCCESSFUL!' } 
        else 
            format.html { render :action => "edit" } 
            format.json { render :json => current_user.errors, :status => :unprocessable_entity } 
        end 
    end 
end

答案 1 :(得分:3)

在您的控制器操作方法中,您编写了format.js这就是导致此错误的原因。

将其更改为format.json { render :json => true },或者在您的视图中,您可以创建名为profiles/update_avatar.js的文件。

所以你的控制器动作应如下所示:

def update_avatar
respond_to do |format|
  if current_user.update_cropped_avatar(params[:image])
    format.json { render :json => true }   #<-------Change here
    format.html { render :nothing => true, :notice => 'Update SUCCESSFUL!' }
  else
    format.html { render :action => "edit" }
    format.json { render :json => current_user.errors, :status => :unprocessable_entity }
  end
end