我已经构建了一个像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
,但该模板不存在(也不应该存在)。通过索引过滤器后,事件将显示在事件索引页面上。一页上有多个事件。
我很感激任何帮助!感谢。
答案 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
希望有所帮助。