使用Ajax加载rails部分

时间:2016-07-11 03:19:07

标签: javascript jquery ruby-on-rails ruby ajax

我已经阅读了大量的教程,但我似乎无法让它发挥作用。我正在使用acts_as_votable gem并且当某人“喜欢”某个资源(我的可投票模型)时,我试图加载“不同”部分。

资源索引:

<div class="votes">
    <% if (current_user.liked? resource) %>
        <!-- Unlike -->
        <%= render(:partial => 'unlike', :locals => {:resource => resource})%>
    <% else %>
        <!-- Like -->
        <%= render(:partial => 'like', :locals => {:resource => resource})%>
    <% end %>
</div>

资源控制器:

def index
  @resources = Resource.all.order(:cached_votes_up => :desc)
end

def like
  @resource = Resource.find(params[:id])
  @resource.liked_by current_user
  respond_to do |format
    format.html { redirect_to :back }
    format.js { render layout: false }
  end
end

路线

Rails.application.routes.draw do
  resources :resources do 
    member do
      get "like", to: "resources#like"
      get "unlike", to: "resources#unlike"
    end
  end
end

like.js.erb

$('.like_resource').bind('ajax:success', function(){
   $(this).closest('.like_resource').hide();
   $(this).closest('.votes').html('<%= escape_javascript (render partial: 'like', locals: { :resource => resource } ) %>');
});

_like.html.erb

<%= link_to like_resource_path(resource), method: :get, remote: true, class: 'like_resource' do %>
    <button class="ui basic compact icon right floated button vote_count">
        <i class="heart icon" style="color: #F1F1F1"></i> <%= resource.get_likes.size %>
    </button> 
<% end %>

当前功能 - 当我点击like按钮时,会注册类似的,但是ajax不会加载部分。我需要重新加载页面才能看到更新的不同按钮。

如果我更改like.js.erb文件以包含一个简单的链接而不是加载部分链接,它似乎正确加载。

$('.like_resource').bind('ajax:success', function(){
   $(this).closest('.like_resource').hide();
   $(this).closest('.votes').html(' <%= link_to "Unlike", unlike_resource_path(@resource), remote: true, method: :get, class: 'unlike_resource' %>');
});

1 个答案:

答案 0 :(得分:1)

修复了这个问题!控制台发布了一个500内部错误,但没有提供有关正在发生的事情的洞察力。我跳进了log / development.log并发现了这个错误:

undefined local variable or method `resource'

我在ajax部分局部变量调用中缺少“@”。将最后一行更改为:

$(this).closest('.votes').html('<%= escape_javascript (render partial: 'like', locals: { :resource => @resource } ) %>');