我正在尝试使用咖啡脚本在ajax调用之后渲染部分但无法实现。
在AJAX请求中调用的控制器
def unfollow
@user = User.find(params[:follow][:followed_id])
current_user.unfollow!(@user)
render json: {result: "success"}
end
partial:User / follow.html.erb
<div id="follow_button">
<%=form_for(:follow,url: follow_users_path,remote:true) do |f| %>
<%= f.hidden_field :followed_id, value: @user.id %>
<%= f.submit "Follow", id: "Follow_button", class: "btn btn-primary" %>
<% end %>
</div>
Ajax:成功函数
$ ->
$('#unfollow_button').on "ajax:success", (e,data,status,xhr) ->
$('#follow_unfollow_button').html("<%= escape_javascript( render partial: 'users/follow') %>")
该地点的HTML
<div id="unfollow_button">
<%=form_for(:follow,url: unfollow_users_path,remote:true) do |f| %>
<%= f.hidden_field :followed_id, value: @user.id %>
<%= f.submit "Unfollow", id: "unfollow_button", class: "btn btn-primary" %>
<% end %>
</div>
我没有从服务器获得任何价值我只想在ajax成功时呈现它。但它像这样呈现
<%= escape_javascript( render partial: 'users/follow') %>
如何解决这个问题?我错过了什么?
答案 0 :(得分:2)
是的,你不能从像这样的json响应中呈现一个错误的部分内部javascript。以下是修复方法
1)从控制器中删除此行
render json: {result: "success"}
2)在views / users /中使用以下代码
创建名为unfollow.js.coffee
的文件
$('#follow_unfollow_button').html("<%= j render('users/follow') %>")
3)您不再需要绑定到ajax成功函数,因此从您拥有它的任何地方完全删除此代码
$ ->
$('#unfollow_button').on "ajax:success", (e,data,status,xhr) ->
$('#follow_unfollow_button').html("<%= escape_javascript( render partial: 'users/follow') %>")
答案 1 :(得分:2)
在这种情况下,不要尝试从coffeescript渲染它。而是从控制器呈现结果并将其作为数据返回到ajax。
1)将控制器方法更改为
def unfollow
@user = User.find(params[:follow][:followed_id])
current_user.unfollow!(@user)
render 'users/follow', :layout => false
end
2)将JS功能更改为
$ ->
$('#unfollow_button').on "ajax:success", (e,data,status,xhr) ->
$('#follow_unfollow_button').html(data)
由于你的控制器将返回一些东西(而不是错误),ajax:success将启动,而不是尝试在JS / coffeescript中渲染它,只需在控制器中渲染它,这样,你也不会...为了将信息返回给客户端,我们需要渲染一些东西。