使用Ajax更新Ruby on Rails部分

时间:2013-11-19 21:39:10

标签: ruby-on-rails ajax

我已经构建了一个像Facebook一样/不像按钮的图标,我试图通过Ajax更新它,但似乎无法让它工作。我想我错过了一些简单的事情。

events_controller.rb

def fav
  @event = Event.find(params[:id])
  current_user.toggle_flag(@event, :fav) #events_helper.rb 

  respond_to do |format|
    format.js
  end
end

events_helper.rb

def toggle_fav(event, user)
  if user_signed_in? #change icon from heart to empty heart and vice-versa
    link_to user.flagged?(event, :fav) ? #if the event is flagged
      content_tag(:span, " ", :class => "glyphicon glyphicon-heart") : #show full heart
      content_tag(:span, " ", :class => "glyphicon glyphicon-heart-empty"), #else show empty heart
      fav_event_path(event), #path that changes the state of the heart
      :remote => true
    else
      link_to content_tag(:span, " ", :class => "glyphicon glyphicon-heart-empty"), fav_event_path(event) #prompt user to sign in
  end
end

活动/ index.html.erb

<% @events.each do |event| %>
  <%= render 'each_event', :event => event %>
<% end %>

_each_event.html.erb(仅限相关信息)

<div class="row">
  <div class="event-div">
    <div class="event-details">
      <ul><li class="fav-li"><%= render 'fav_li', :event => event %></li></ul>
    </div>
  </div>
</div>

_fav_li.html.erb

<%= toggle_fav(event, current_user) %>

fav.js.erb

$('.fav-li').html('<%=j render 'events/fav_li', :event => event, :layout => false %>');

我按照本教程制作了类似按钮:http://www.youtube.com/watch?v=GG-kCSx0taU 我正在使用make_flaggable gem。

现在,当我更新按钮时,它会将我引导至http://localhost:3000/events/23/fav,但该模板不存在(也不应该存在)。通过索引过滤器后,事件将显示在事件索引页面上。一页上有多个事件。

我很感激任何帮助!感谢。

1 个答案:

答案 0 :(得分:1)

您的控制器正在format.js块中执行respond_to。它期望存在一个js模板,因此它可以将其作为响应运行。像app/views/events/fav.js.erb这样的东西。此文件将包含一些js代码,这些代码将使用控制器操作的结果更新您的视图,例如将图标从glyphicon-heart-empty更新为glyphicon-heart

以下是讨论js.erb模板的另一个问题/答案:How does js.erb work

希望有所帮助。