在 ruby​​ rails html 视图中使用 Ajax 表单更改图标“like”按钮类

Posted

技术标签:

【中文标题】在 ruby​​ rails html 视图中使用 Ajax 表单更改图标“like”按钮类【英文标题】:Change icon "like" button class with Ajax form in ruby rails html view 【发布时间】:2020-04-19 18:48:25 【问题描述】:

我正在努力让我的页面在 Ajax 功能成功后更新图标。数据已成功发布到数据库,但我仍然需要刷新页面才能更新内容。我想更改图标(通过更改样式或类)并在不刷新页面的情况下显示新图标。

这是我的控制器:

class VotesController < ApplicationController
  def create
    @vote = Vote.new
    @vote.voter_id = session[:user_id]
    @vote.post_id = params.fetch("post_id_from_query")
    @vote.bestoutfit_id = params.fetch("bestoutfit_id_from_query")

    if @vote.post_id == nil
      redirect_to("/feed",  :notice => "Vote failed to create successfully." )
    else
      @vote.save
      redirect_to( :template => "/feed" )
    end
  end
end

我的 ajax 函数如下所示:

<script>

  $(function()
  $(".post-form").on('click', function(event)
    $.ajax(
      type: "POST",
      url: this.action,
      data: $(this).serialize(),
      success: function(response) 
        $('i').removeClass('far fa-heart').addClass('fas fa-heart');
      
    );
    event.preventDefault();
  );
)

</script>

我的 html 代码如下所示:

<form action="/insert_vote" method="post" class="post-form" data-remote="true">
<input type="hidden" value="<%= post.id %>" name="post_id_from_query">
<input type="hidden" value="<%= post.outfit1_id %>" name="bestoutfit_id_from_query">     
<button class="button"> 
<div class="arrow-left">
<p> <i class="far fa-heart"></i></p>
</div> 
</button>
</form>

我也遇到了这个错误:

VM268:1 Uncaught ReferenceError: Turbolinks is not defined
    at <anonymous>:1:1
    at b (jquery.min.js:2)
    at Function.globalEval (jquery.min.js:2)
    at text script (jquery.min.js:2)
    at jquery.min.js:2
    at l (jquery.min.js:2)
    at XMLHttpRequest.<anonymous> (jquery.min.js:2)

提前感谢您的帮助!

【问题讨论】:

你可以使用它的类选择器而不是i$('.fa-heart').removeClass('far').addClass('fas'); 【参考方案1】:

在 application.js 中,您是否需要 jquery 和 turbolinks 之间的 jquery.turbolinks,如下所示?

//= require jquery
//= require jquery.turbolinks
//= require jquery_ujs
//= require masonry/jquery.masonry
//= require turbolinks
//= require_tree 

如果您的 turbolinks 版本是 5,jquery-turbolinks gem 不支持 turbolinks 5。因此,目前,您必须添加 JS 以实现兼容性,参考此 issue(请参阅 Lowryderch 的评论)。将 turbolinks-compatibility.coffee 放在 app/assets/javascripts/ 文件夹下

如果一切正确。

在你看来

<span id="heart_div"> <i class="far fa-heart"></i></span>

在你的 JS Success 函数中

$('#heart_div').html('<i class="fas fa-heart"></i>')

【讨论】:

它实际上并不是主要问题。相反,我在应用程序控制器中呈现了部分视图。 turbolinks 错误似乎是我设置 Javascript 文件的方式以及视图文件中的 javascript 调用标记的问题。

以上是关于在 ruby​​ rails html 视图中使用 Ajax 表单更改图标“like”按钮类的主要内容,如果未能解决你的问题,请参考以下文章

如何改进 Ruby on Rails 视图中的代码

Ruby On Rails 部分渲染

Ruby on Rails 在带有静态脚本文件的视图中渲染

Ruby on rails 参数出现在 url

Ruby on Rails - 从视图调用控制器方法

Ruby on Rails 使用视图助手中的变量在视图中动态生成字段名称