Как предотвратить слишком быструю повторную отправку формы в приложении rails? - PullRequest
1 голос
/ 29 апреля 2010

Я сделал простое приложение на Rails, которое позволяет людям комментировать посты. Как я могу запретить этому пользователю отправлять эту форму снова и снова? На reddit.com они позволяют новым пользователям делать новые сообщения каждые десять минут. Как я могу сделать это с моей простой системой блогов / комментариев? Любая помощь будет принята с благодарностью. Спасибо за чтение моего вопроса. РЕДАКТИРОВАТЬ: я пытаюсь сделать это без пользовательской модели.

Вот мой текущий контроллер комментариев:

class CommentsController < ApplicationController
  # before_filter :require_user, :only => [:index, :show, :new, :edit]

  before_filter :post_check

  def record_post_time
    cookies[:last_post_at] = Time.now.to_i
  end

  def last_post_time
    Time.at((cookies[:last_post_at].to_i rescue 0))       
  end

  MIN_POST_TIME = 2.minutes

  def post_check
    return true if  (Time.now - last_post_time) > MIN_POST_TIME

    # handle error
    # flash("Too many posts")
  end

  def index
    @message = Message.find(params[:message_id])
    @comments = @message.comments
  end

  def show
    @message = Message.find(params[:message_id])
    @comment = @message.comments.find(params[:id])
  end

  def new
    @message = Message.find(params[:message_id])
    @comment = @message.comments.build
  end

  def edit
    @message = Message.find(params[:message_id])
    @comment = @message.comments.find(params[:id])
  end

  def create
    @message = Message.find(params[:message_id])
    @comment = @message.comments.build(params[:comment])
    #@comment = Comment.new(params[:comment])
    if @comment.save
      record_post_time#
      flash[:notice] = "Replied to \"#{@message.title}\""
      redirect_to(@message)
      # redirect_to post_comment_url(@post, @comment) # old
    else
      render :action => "new"
    end
  end

  def update
    @message = Message.find(params[:message_id])
    @comment = Comment.find(params[:id])
    if @comment.update_attributes(params[:comment])
      record_post_time
      redirect_to post_comment_url(@message, @comment)
    else
      render :action => "edit"
    end  
  end

  def destroy

  end
end

Ответы [ 2 ]

2 голосов
/ 29 апреля 2010

Попробуйте это:

class CommentsController < ApplicationController
before_filter :post_check        
def record_post_time
  cookies[:last_post_at] = Time.now.to_i
end
def last_post_time
  Time.at((cookies[:last_post_at].to_i rescue 0))       
end    
MIN_POST_TIME = 2.minutes    
def post_check
  return true if  (Time.now - last_post_time) > MIN_POST_TIME
  flash[:notice] = "Too many comments makes you a busy cat!"
  @message = Message.find(params[:message_id])
  redirect_to(@message)
  return false
end
def create
  @comment = Comment.new(params[:comment])
  if @comment.save
    record_post_time
  else
  end
end

def update
  @comment = Comment.find(parms[:id])
  if @comment.update_attributes(params[:comment]))
    record_post_time
  else
  end
end    
end
1 голос
/ 29 апреля 2010

В вашем классе комментариев вы можете сделать:

validate :posting_too_often

def posting_too_often
  c = self.post.comments.find_by_user_id(self.user_id, :limit => 1, :order => 'created_at desc')
  if c && c.created_at > 10.minutes.ago
    self.errors.add_to_base("stop posting so many crappy comments!")
  end
end

Это может не сработать, потому что я не проверял это, но это должно направить вас в правильном направлении. Что вы делаете:

Перед созданием комментария загрузите последний комментарий этого пользователя. Если он существует и был опубликован в течение последних 10 минут, добавьте в базу ошибку с объяснением того, почему ее нельзя было сохранить.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...