【问题标题】:Ruby on Rails - Limit a user to a set number of database entriesRuby on Rails - 将用户限制为一定数量的数据库条目
【发布时间】:2014-03-26 00:25:04
【问题描述】:

我想限制用户可以添加到数据库中的记录数量。

我不确定用“Rails”的方式来解决这个问题...

我正在使用 Devise 并考虑创建自定义验证方法,但您无法从模型中访问 current_user,这是不正确的。

如何从控制器执行此操作并仍向我的用户返回错误消息?

我有这个

 validate :post_count

  def post_count
    current = current_user.posts.count
    limit = current_user.roles.first.posts.count

    if current > limit
      errors.add(:post, "Post limit reached!")
    end
  end

但这不是正确的方法,因为让 current_user 进入模型会很麻烦

【问题讨论】:

  • 也许您可以在创建新帖子时进行验证。然后,您可以计算与当前正在创建的帖子的创建者相同的用户创建了多少帖子(从而避开了 current_user 的问题),并将其与该用户的限制进行比较。
  • 好的,我如何在模型中检查“limit = current_user.roles.first.posts.count”?
  • 查看背包客的回答,但我建议移动代码以检索 User 类上的方法的限制。

标签: ruby-on-rails ruby devise


【解决方案1】:

你可以这样做:

class User < ActiveRecord::Base
  has_many :domains
  has_many :posts, through: :domains

  def post_limit
    roles.first.posts.count
  end
end

class Domain < ActiveRecord::Base
  belongs_to :user
  has_many :posts
end

class Post < ActiveRecord::Base
  belongs_to :domain
  delegate :user, to: :domain
  validate :posts_count_within_limit, on: :create

  def posts_count_within_limit
    if self.user.posts(:reload).count >= self.user.post_limit # self is optional
      errors.add(:base, 'Exceeded posts limit')
    end
  end
end

基于this answer。

【讨论】:

  • 好吧,看起来不错,但我需要从数据库中获取当前用户限制?
  • 只需将&lt;your limit&gt; 替换为user.roles.first.posts.count(假设这是数据库中的限制)。
  • 我建议将限制的检索移动到用户对象上的方法,而不是在验证中内联。 (即,在验证中将 self.user.roles.first.posts.count 替换为 self.user.post_limit 并将该代码放在 User 类的 post_limit 方法中。
  • 好吧,这正是我想要的,但我意识到它不起作用,因为我在用户和帖子之间有另一个模型......它是user has_many :domains, domain has_many :posts。我在域模型中尝试了delegate :user, :to =&gt; :posts,但它似乎不起作用?我收到错误 undefined method user'`
  • @MaxRose-Collins 完美! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
相关资源
最近更新 更多