【问题标题】:Remove former elements from ajax code in rails从rails中的ajax代码中删除以前的元素
【发布时间】:2020-09-23 10:15:15
【问题描述】:

我正在尝试在切换“喜欢”按钮上应用 AJAX。此设置在不刷新整个页面的情况下更新按钮状态,但之前的<%= pluralize(@company.get_likes.size, "people liked it") %> 不会被删除(“0”人喜欢它,添加到新的“1”人喜欢它”)

如何去掉前面的"@company.get_likes.size" people liked it 句? 如何改进代码?

控制器:

  def toggle_favorite(company)
    if user_signed_in?
      if current_user.liked? company
        link_to raw("<i class='fa fa-star'></i>"), unlike_company_path(company), remote: true, method: :put
      else
        link_to raw("<i class='far fa-star'></i>"), like_company_path(company), remote: true, method: :put
      end
    else
      link_to 'sign in to like', new_user_session_path
    end
  end

路线:

resources :companies do
    member do
      put "like" => "companies#like"
      put "unlike", to: "companies#unlike"
    end
end

查看:

<div class="text-center">
  <div id="<%= dom_id(company) %>">
    <%= pluralize(company.get_likes.size, "people liked it")) %>
    <%= toggle_favorite(company) %>
  </div>
</div>

like.js.erb

let starIcon = document.querySelector("#company_<%= @company.id %>").querySelector('.fa-star')
starIcon.parentElement.outerHTML = "<%= pluralize(@company.get_likes.size, "people liked it") %> <%= escape_javascript(toggle_favorite(@company)) %>"

不像.js.erb

let farstarIcon = document.querySelector("#company_<%= @company.id %>").querySelector('.fa-star')
farstarIcon.parentElement.outerHTML = " <%= pluralize(@company.get_likes.size, t('views.company.bookmark.count_bookmark')) %> <%= escape_javascript(toggle_favorite(@company)) %>"

【问题讨论】:

    标签: javascript ruby-on-rails ajax


    【解决方案1】:

    您可以通过application_helper.rb 文件实现此目的:

    对于这种特殊情况,我宁愿使用.count 而不是.size(由您决定)。更多信息,您可以查看count vs length vs size in a collection Stack Overflow 问题。

    1-定义方法:

    def pluralize_get_likes(get_likes)
        if get_likes.count > 0
          "#{get_likes.count} people liked this"
        else
          "Here the text you want to be displayed (e.g.: Be the first one to vote this)"
        end
      end 
    

    2-应用方法:

    like.js.erbunlike.js.erb 文件中的“pluralize”替换为“pluralize_get_likes”。

    like.js.erb:

    let starIcon = document.querySelector("#company_<%= @company.id %>").querySelector('.fa-star')
    starIcon.parentElement.outerHTML = "<%= pluralize_get_likes(@company.get_likes) %> <%= escape_javascript(toggle_favorite(@company)) %>"
    

    视图也是如此:

    <div class="text-center">
      <div id="<%= dom_id(company) %>">
        <%= pluralize_get_likes(company.get_likes) %>
        <%= toggle_favorite(company) %>
      </div>
    </div>
    

    应该可以的。

    【讨论】:

    • 您好,感谢您的帮助。您正在解决代码简化的目标(谢谢)。但是,我正在尝试解决 ajax 调用正在添加文本的问题。
    • 我得到以下错误:未捕获的语法错误:重新声明 let starIcon 我正在查看类似的内容:starIcon.parentElement.outerHTML.remove();不会触发“未捕获的 TypeError:starIcon.parentElement.outerHTML.remove 不是函数”
    • 您好,该错误是由'let' startIcon 引起的。您是否考虑过使用like.jsunlike.js 文件以及您已经拥有的js.erb 文件(用于AJAX 请求)?因为那时,您可以在.js 文件中声明和启动startIcon 函数,并直接从.js.erb 文件中调用该函数方法以从DOM 中删除元素。我可以告诉你怎么做。
    猜你喜欢
    • 1970-01-01
    • 2018-02-21
    • 2011-08-14
    • 1970-01-01
    • 2013-03-23
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多