【问题标题】:How do I validate a time in Rails? Limiting a user to post once a day如何在 Rails 中验证时间?限制用户每天发布一次
【发布时间】:2011-07-24 23:16:02
【问题描述】:

我正在尝试将用户的帖子限制为每天一次,我正在考虑检查 Time.now - last_post_time 是否为

我想做的是只允许一个月内每天发一个帖子,所以如果用户在 3 月 28 日发帖,他在 29 日之前不能再次发帖。但如果他在 3 月 28 日晚上 10 点发帖,他可以在 3 月 29 日凌晨 12:01 再次发帖。

我该怎么做?

编辑:

这是我的posts_controller,我可以就如何重构它获得一些帮助吗?

def create
    @post  = current_user.posts.build(params[:supportpost])
        if @post.save
          flash[:success] = "Your post was created!"
          redirect_to root_path
        else
          @feed_items = []
          render 'pages/home'
        end
    end

我正在尝试这样的事情,但它肯定是错误的:

  def create
    post = @user.posts.find(:first, :conditions => ["STRFTIME('%d', created_at) = ?", Date.today.day])
      if post
       @post  = current_user.posts.build(params[:supportpost])
        if @post.save
          flash[:success] = "Your post was created!"
          redirect_to root_path
        else
          @feed_items = []
          render 'pages/home'
        end
    end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 validation time


    【解决方案1】:

    我可能会在 Post 模型的验证中添加此检查。也许是这样的:

    class Post < ActiveRecord::Base
      ...
    
      validate :date_scope
    
    private
      def date_scope
        if Post.where("user_id = ? AND DATE(created_at) = DATE(?)", self.user_id, Time.now).all.any?
          errors.add(:user_id, "Can only post once a day")
        end
      end
    end
    

    【讨论】:

    • 也感谢您的帮助,我已按原样尝试过此解决方案,但在尝试访问用户主页时出现错误“ArgumentError(您需要提供至少一个验证):app/models /post.rb:34:in &lt;class:Post&gt;' app/models/post.rb:19:in ' app/controllers/pages_controller.rb:6:in `home'
    • 对不起,我的错字。应该是验证而不是验证
    • 现在可以使用了,谢谢。我看到 redirect_to 和 render 方法由于某种原因不可用,有没有办法渲染 pages#home 并出现错误?
    • 当你说它们不可用时,你把它们放在哪里了?验证的美妙之处在于,如果在模型中添加了错误,那么控制器中的 @post.save 将返回 false,因此您可以在那里处理所有渲染或重定向,而不是在模型中。
    【解决方案2】:
    post = @user.posts.find(:first, :conditions => ["DATE(created_at) = DATE(?)", Time.now])
    if post
      # he made a post today!
    else 
      #he can post
    end
    

    总而言之,它会生成以下 SQL 查询:

     SELECT `posts`.* FROM `posts` WHERE (`posts`.user_id = 1) AND (DATE(created_at) = DATE('2011-03-29 04:35:45')) LIMIT 1
    

    【讨论】:

    • 感谢您的回复,您认为您可以详细说明一下该代码吗?我对 SQLite 代码不是很熟悉,看起来这就是你正在使用的?非常感谢。
    • 仅供参考,如果您使用 DAY 而不是 DATE,它将阻止用户在下个月的同一天发布。不知道这是不是目的,但我不这么认为
    • 非常感谢您的解释,虽然我现在了解您所写的内容,但我仍然不知道如何将其纳入我的代码。我已经编辑了原始问题以使用我的 post_controller 创建方法,这是我认为我需要重构的地方。您能否为我介绍一下如何集成此解决方案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    相关资源
    最近更新 更多