在ajax上渲染部分:在rails 5中coffeescript成功

时间:2017-02-16 14:32:35

标签: ruby-on-rails ajax coffeescript

我正在尝试使用咖啡脚本在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') %>

如何解决这个问题?我错过了什么?

2 个答案:

答案 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中渲染它,只需在控制器中渲染它,这样,你也不会...为了将信息返回给客户端,我们需要渲染一些东西。