Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 限制用户在特定人员上发表文章的频率';轨道中的s剖面/墙_Ruby On Rails 3_Datetime_Timezone - Fatal编程技术网

Ruby on rails 3 限制用户在特定人员上发表文章的频率';轨道中的s剖面/墙

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

如何限制用户每天只能在特定用户的墙上发布一到两次?我主要想这样做是为了限制垃圾邮件。下面是我的墙、模型、视图和控制器代码。我真的不知道该怎么做,因为我是rails的新手,但我知道现在有时间了。我不确定如何实现这样一个特性

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