在 rails 中每位用户仅评价一次 post
Rate a post only once per user in rails
我无法让用户评价 post。我的任务是让用户只对 post 评分一次。在显示页面上,我的 post 包含用于评级的单选按钮。如果用户第二次尝试评分,则需要更新用户之前对相同 post 所做的评分。我面临的问题是用户能够多次评价 post。如何解决?
用户模型:
class User < ApplicationRecord
has_many :posts
has_many :ratings
end
Post 型号:
class Post < ApplicationRecord
has_many :ratings
belongs_to :user
end
评分模型
class Rating < ApplicationRecord
belongs_to :post
belongs_to :user
end
在 post 控制器中,我使用嵌套属性进行评级。
def show
@post = @topic.posts.find(params[:id])
@rate = @post.ratings.all
@rate = Rating.where(post_id: @post.id).group("rate").count
end
private def post_params
params.require(:post).permit(:title, :body, ratings_attributes: [:rate])
end
post 的展示页面包括使用 <fieldset>
创建评级:
<%= form_for [@topic, @post] do |f| %>
<%= f.fields_for :ratings, @post.ratings.build do |builder| %>
<fieldset>
<% for i in 1..5 %>
<%= builder.radio_button :rate, i %><%= i %>
<% end %>
</fieldset>
<% end %>
<%=f.submit "Rate" %>
<% end %>
首先,为评级添加验证以强制用户和 post 组合的唯一性。这将停止创建重复评级。
validates_uniqueness_of :post_id, scope: :user_id
然后在保存评分的动作中,先检查是否有可以更新的记录,否则新建一条。
@rating = Rating.find_or_initialize_by(user: @user, post: @post)
@rating.rate = params[:rate]
@rating.save
这可能不是完美的语法,但您应该了解您正在尝试做什么,并且可以进行调整以匹配您的代码。
可以先使用,也可以这样初始化
@rating=Rating.where(post_id: @post.id,user_id: current_user).first_or_initialize
我无法让用户评价 post。我的任务是让用户只对 post 评分一次。在显示页面上,我的 post 包含用于评级的单选按钮。如果用户第二次尝试评分,则需要更新用户之前对相同 post 所做的评分。我面临的问题是用户能够多次评价 post。如何解决?
用户模型:
class User < ApplicationRecord
has_many :posts
has_many :ratings
end
Post 型号:
class Post < ApplicationRecord
has_many :ratings
belongs_to :user
end
评分模型
class Rating < ApplicationRecord
belongs_to :post
belongs_to :user
end
在 post 控制器中,我使用嵌套属性进行评级。
def show
@post = @topic.posts.find(params[:id])
@rate = @post.ratings.all
@rate = Rating.where(post_id: @post.id).group("rate").count
end
private def post_params
params.require(:post).permit(:title, :body, ratings_attributes: [:rate])
end
post 的展示页面包括使用 <fieldset>
创建评级:
<%= form_for [@topic, @post] do |f| %>
<%= f.fields_for :ratings, @post.ratings.build do |builder| %>
<fieldset>
<% for i in 1..5 %>
<%= builder.radio_button :rate, i %><%= i %>
<% end %>
</fieldset>
<% end %>
<%=f.submit "Rate" %>
<% end %>
首先,为评级添加验证以强制用户和 post 组合的唯一性。这将停止创建重复评级。
validates_uniqueness_of :post_id, scope: :user_id
然后在保存评分的动作中,先检查是否有可以更新的记录,否则新建一条。
@rating = Rating.find_or_initialize_by(user: @user, post: @post)
@rating.rate = params[:rate]
@rating.save
这可能不是完美的语法,但您应该了解您正在尝试做什么,并且可以进行调整以匹配您的代码。
可以先使用,也可以这样初始化
@rating=Rating.where(post_id: @post.id,user_id: current_user).first_or_initialize