我有控制器:“喜欢”,动作:“创建”
def create
@micropost = Micropost.find(params[:micropost_id])
current_user.like(@micropost)
@micropost.reload
@likes = @micropost.count_likes
respond_to do |format|
format.html { redirect_to root_path }
format.js
end
end
此操作将请求json并使用ajax更新视图,如果我这样写,该视图将正确呈现:
$("#like_count-<%= @micropost.id %>").html('<%= @likes %>');
但是写:
$("#like_count-<%= @micropost.id %>").html('<%= @micropost.count_likes %>');
不起作用。我还检查了@ micropost.reload之后,@ micropost.count_likes的值是否已更新。我不知道发生这种情况的原因。希望你们能有所帮助。这是Micropost的源代码:
class Micropost < ActiveRecord::Base
# micropost belong to one user
belongs_to :user
# many user can like one micropost
has_many :user_likes, class_name: "Like",
foreign_key: "micropost_id",
dependent: :destroy
has_many :likers, through: :user_likes, source: :user
default_scope -> { order(created_at: :desc) }
mount_uploader :picture, PictureUploader
validates(:content, presence: true, length: {:maximum => 200})
validates(:user_id, presence: true)
validate :picture_size
def count_likes
user_likes.length > 0 ? "(#{user_likes.length})" : ""
end
private
# Validates the size of an uploaded picture.
def picture_size
if picture.size > 1.megabytes
errors.add(:picture, "should be less than 1MB")
end
end
end
更新
向Likes#create的表单发布请求:
<%= form_for(micropost.user_likes.build, remote: true) do |f| %>
<div><%= hidden_field_tag :micropost_id, micropost.id %></div>
<%= f.submit "like", class: "btn btn-primary", style: "width: 100px" %>
<% end %>
用户类:
class User < ActiveRecord::Base
...
# user can like many microposts
has_many :pos_likes, class_name: "Like",
foreign_key: "user_id",
dependent: :destroy
has_many :fav_posts, through: :pos_likes, source: :micropost
...
# like a post
def like(micropost)
self.pos_likes.create(user_id: self.id, micropost_id: micropost.id)
end
这里的问题在于使用#length
而不是#count
方法。下面对它们之间的区别进行了很好的解释:
在复杂的ActiveRecord情况下,大小,长度和计数之间的差异
因此,要解决这个问题,你需要使用user_likes.count
,而不是user_likes.length
在你的Micropost#count_likes
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句