Ruby on rails 3 限制用户在特定人员上发表文章的频率';轨道中的s剖面/墙
如何限制用户每天只能在特定用户的墙上发布一到两次?我主要想这样做是为了限制垃圾邮件。下面是我的墙、模型、视图和控制器代码。我真的不知道该怎么做,因为我是rails的新手,但我知道现在有时间了。我不确定如何实现这样一个特性Ruby on rails 3 限制用户在特定人员上发表文章的频率';轨道中的s剖面/墙,ruby-on-rails-3,datetime,timezone,Ruby On Rails 3,Datetime,Timezone,如何限制用户每天只能在特定用户的墙上发布一到两次?我主要想这样做是为了限制垃圾邮件。下面是我的墙、模型、视图和控制器代码。我真的不知道该怎么做,因为我是rails的新手,但我知道现在有时间了。我不确定如何实现这样一个特性 Class UsersController < ApplicationController def show @user = User.find(params[:id]) @first_name = @user.first_name @last_name = @us
Class UsersController < ApplicationController
def show
@user = User.find(params[:id])
@first_name = @user.first_name
@last_name = @user.last_name
@wallpost = WallPost.new(params[:wall_post])
@showwallposts = @user.received_wallposts
end
def create
@wallpost = WallPost.create(params[:wall_post])
end
Class UsersController
模型
class WallPost < ActiveRecord::Base
attr_accessible :content, :receiver_id, :sender_id
belongs_to :receiver, :class_name => "User", :foreign_key => "receiver_id"
belongs_to :sender, :class_name => "User", :foreign_key => "sender_id"
end
class User < ActiveRecord::Base
has_many :sent_wallposts, :class_name => 'WallPost', :foreign_key => 'sender_id'
has_many :received_wallposts, :class_name =>'WallPost', :foreign_key => 'receiver_id'
class-WallPost“用户,:外键=>“接收者\u id”
属于\u-to:sender,:class\u-name=>“User”,:foreign\u-key=>“sender\u-id”
结束
类用户'WallPost',:foreign\u key=>'sender\u id'
是否有多个:已接收\u WallPost、:class\u name=>“WallPost”、:foreign\u key=>“receiver\u id”
在视图中
<%= form_for(@wallpost, :url => {:action => 'create'}) do |f| %>
<%= f.hidden_field :receiver_id, :value => @user.id %>
<%= f.hidden_field :sender_id, :value => current_user.id %>
<%= f.text_area :content, :class => 'inputbox' %>
<%= f.submit 'Post', class: 'right btn' %>
<% end %>
{:action=>'create'})do | f |%>
@user.id%>
当前用户id%>
'输入框'%>
您可以创建确保该用户当天在该用户的墙上创建了最大的每日限额的帖子:
class SpamValidator < ActiveModel::Validator
DAILY_LIMIT = 2
def validate(record)
if similar_posts_today(record).count >= DAILY_LIMIT
record.errors[:spam_limit] << 'Too many posts today!'
end
end
def similar_posts_today(record)
WallPost.where(receiver: record.receiver, sender: record.sender)
.where("DATE(created_at) = DATE(:now)", now: Time.now)
end
end
然后,当尝试创建超出常量中设置的限制的墙柱时,它将失败并出现验证错误。您需要在控制器中的create
操作中处理这种情况。一种简单(但在用户体验方面并非最佳)的处理方法是:
def create
@wallpost = WallPost.new(params[:wall_post])
flash[:error] = "You've reached the daily posting limit on that wall." unless @wallpost.save
redirect_to user_path(@wallpost.receiver)
end
这样,它将尝试保存新的墙柱,如果无法保存,它将在上面的错误消息中设置flash[:error]
。您需要在您的show.html.erb
页面上用
显示此信息,非常感谢。非常感谢。我从没听说过验证器。从您的解决方案中学到了很多。顺便说一句,“如果今天发布类似的帖子(记录)。计数>每日限额”应该是“如果今天发布类似的帖子(记录)。计数>=每日限额”,以便强制执行限额。再次感谢。我真的很感激。只是让你知道,如果你想修改你的文章,其他用户可能会偶然发现它。
def create
@wallpost = WallPost.new(params[:wall_post])
flash[:error] = "You've reached the daily posting limit on that wall." unless @wallpost.save
redirect_to user_path(@wallpost.receiver)
end