我正在使用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]}.
为什么?
答案 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