Ruby on Rails收藏按钮AJAX切换遇204 No Content错误及状态不更新
解决收藏按钮状态不更新的问题
看起来你遇到的核心问题是收藏功能触发后找不到对应JS模板,同时还有几个变量未正确赋值的小问题,导致按钮状态没更新。咱们一步步来修复:
1. 修复JS模板文件名错误
控制台报错No template found for FavouritesController#create,是因为你把create动作对应的JS模板命名成了created.js.erb,但Rails约定动作名对应的模板名要完全一致——应该改成create.js.erb(注意是create不是created)。
另外,destroy的模板里console.log的提示文案写错了,建议改成"Removed from your favourite List",避免和收藏成功的提示混淆。
2. 修正控制器中的变量问题
(1)补充@is_favourited变量定义
你的create.js.erb和destroy.js.erb里都用到了@is_favourited,但控制器的两个动作里都没定义这个变量,Rails会找不到它。同时destroy动作里还错误把@post写成了@school,也得修正:
更新后的控制器代码:
class FavouritesController < ApplicationController before_action :authenticate_user! def create @favourite = current_user.favourites.build(favourite_params) if @favourite.save @post = @favourite.post # 新增:设置收藏成功后的状态变量 @is_favourited = true respond_to :js else flash[:alert] = "something went wrong..." end end def destroy @favourite = Favourite.find(params[:id]) # 修正:把@school改成@post,和create动作保持变量名一致 @post = @favourite.post if @favourite.destroy # 新增:设置取消收藏后的状态变量 @is_favourited = false respond_to :js else flash[:alert] = "Something Went Wrong..." end end private def favourite_params params.permit :user_id, :post_id end end
(2)优化模型的is_favourited方法(可选)
你的Post#is_favourited方法可以优化成更高效的版本,用exists?代替find_by,避免不必要的对象实例化:
class Post < ApplicationRecord belongs_to :user has_many :favourites def is_favourited?(user) favourites.exists?(user_id: user.id) end end
3. 确认部分视图的渲染逻辑
确保views/posts/_favourite.html.erb里正确使用is_favourited变量来切换按钮状态,比如:
<% if is_favourited %> <%= link_to "取消收藏", favourite_path(@post.favourites.find_by(user_id: current_user.id)), method: :delete, remote: true, id: "favourite" %> <% else %> <%= link_to "收藏", favourites_path(post_id: @post.id), method: :post, remote: true, id: "favourite" %> <% end %>
4. 验证JS模板的正确性
修正后的create.js.erb:
$('#favourite').html('<%= j render "posts/favourite", {is_favourited: @is_favourited, post: @post} %>'); console.log("Added to your favourite List");
修正后的destroy.js.erb:
$('#favourite').html('<%= j render "posts/favourite", {is_favourited: @is_favourited, post: @post} %>'); console.log("Removed from your favourite List");
做完这些修改后,重新启动服务器测试,收藏按钮的状态应该就能正常切换了。
内容的提问来源于stack exchange,提问作者Geni
相关产品推荐
相关产品推荐

