添加为收藏,没有整页刷新

时间:2016-02-10 16:42:52

标签: ruby-on-rails ruby

我正在制作平假名卡片应用程序。 我花了几天时间来了解当我添加闪卡(平假名)作为最爱时如何不刷新整页。

这是最喜欢的控制器

类FavsController< ApplicationController中

  def index
    @favs = Fav.where(user: current_user)
  end

  def create
    @hiragana = Hiragana.find(params[:hiragana_id])
    @fav = current_user.favs.new(hiragana: @hiragana)
    if not @hiragana.favs.where(user: current_user).take
      @fav.save
    end
    render json: @fav
  end

  def destroy
    @fav = Fav.find(params[:id])
    @fav.destroy
    redirect_to :back
  end
end

我在创建方法中渲染json,当我点击视图时,我只添加一个哈希

渲染视图收藏夹

<% if current_user %>
  <div class="hiragana-fav">
    <% if hiragana.is_faved_by(current_user) %>
      <%= link_to fav_path(hiragana.is_faved_by(current_user)), method:   :delete do %>
        <i class="fa fa-heart faved faved-on"></i>
      <% end %>
    <% else %>
      <%= link_to hiragana_favs_path(hiragana), method: :post do %>
        <i class="fa fa-heart faved faved-off"></i>
      <% end %>
    <% end  %>
  </div>
<% end %>

它位于平假名渲染

<div class="row">
  <ul class="list-inline text-center card-frame">
    <li>
      <div class="card">
        <div class="front">
          <% if current_user.try(:admin?) %>
            <%= link_to hiragana_path(hiragana), class:'trash-hiragana', data: { confirm: 'Are you sure?' }, method: :delete do %>
            <%= image_tag("delete-btn.png") %>
            <% end %>
          <% end %>
          <span class="card-question img-popover" data-content="<h4 class='text-center letter-uppercase'><%= hiragana.bigletter.upcase %></h4><p class='text-center'><b><%= hiragana.midletter %></b> comme dans <b><%= hiragana.transcription %></b></p>">
            <i class="fa fa-eye fa-lg"></i>
          </span>

          <div class="card-hiragana hiragana-<%=hiragana.bigletter.downcase.last%>">
            <h1><b><%= hiragana.ideo1 %></b></h1>
          </div>

          <div class="card-katakana">
            <p><%= hiragana.ideo2 %></p>
          </div>

          <%= render 'favs/favorites', hiragana: hiragana %>

        </div>
        <div class="back">
          <div class="col-sm-3 col-xs-4 col-md-3 containerbackcards-<%=hiragana.bigletter.downcase.last%>">
            <div class="backcard-hiragana">
              <h1><b><%= hiragana.ideo1 %></b></h1>
            </div>
            <div class="card-bigletter">
              <h4><%= hiragana.bigletter.upcase %></h4>
            </div>
          </div>
        </div>
      </div>
    </li>
  </ul>
</div>

当我添加一张卡作为收藏时,它给我一个像这样的哈希:

{
id: 64,
user_id: 1,
hiragana_id: 4,
created_at: "2016-02-10T16:37:26.270Z",
updated_at: "2016-02-10T16:37:26.270Z"
}

我只想让心脏灰红色为最爱,保存并不刷新整个页面。感谢您的解释。

1 个答案:

答案 0 :(得分:0)

为了在不刷新页面的情况下将请求发送到控制器,您需要使用Ajax和JavaScript的组合。

使用JavaScript将点击侦听器添加到.faved-on按钮并触发Ajax请求。您还将使用JavaScript来防止单击链接时发生的默认操作,即。页面刷新

然后使用Ajax将请求发送到控制器并处理响应。

您的初始JavaScript代码看起来非常正确,除非您错过了阻止页面重新加载的位。

请参阅下面的e.preventDefault();

$(document).ready(function() { 
 $('.faved-on').click(function(e) { //make sure to pass in the e (the event paramter)
 e.preventDefault(); //this is the line you are missing
 var fav = $('.faved-off')
//let your ajax handle the rest then
 $.ajax({
         type: "POST", url: "/hiraganas", dataType: "json", 
         success: function(data) {
         console.log(data); 
         //change the color of your heart to red here
 }, 
 error: function(jqXHR) {
    console.error(jqXHR.responseText);
    }
   }); 
   })
 })

我没有测试过您的JavaScript,但它看起来非常接近正确,我相信它是您遗漏的e.preventDefault();