1

我是一个苦苦挣扎的编程新手,并试图制作一个具有多种计划的免费增值风格应用程序。

我正在使用 cancan gem 来根据场地的计划(免费、高级、高级+)来分配角色。

我知道如何根据分配的计划限制视图中显示的某些选项,但是如何根据分配的计划限制添加到场所的记录数量?

例如

  • 我希望所有场地都有照片,但免费场地应仅限于 3 个。
  • 我还希望所有场地都有可搜索的标签,但允许的标签数量取决于场地所在的计划。

目前,这些计划只是在场地模型中指定为:

PLANS = %w[free premium premium+]

编辑

感谢 Alex Peattie 的回答,我认为我现在走在了正确的轨道上。

我将行更改validate_on_create :photo_count_within_limit为:

validate :venuephoto_count_within_limit, :on => :create

但是在 VenuesController#update 中出现 ArgumentError:Fixnum 与 nil 的比较失败错误。

另一个编辑

所以现在一切都很好,只需进行以下更改:

def photo_limit
  {:free => 3, :premium => 10}[plan.to_sym]
end

validate :venuephoto_count_within_limit, :on => :create

感谢您的任何帮助,非常感谢!

4

2 回答 2

2

我会给出 Venue 模型方法photo_limittag_limit

class Venue < ActiveRecord::Base

  def photo_limit
    {:free => 3, :premium => 20, :"premium+" => 999}[plan]
  end

end

(这假定一个.plan方法将返回当前场地的计划)

然后在 Photo 中使用验证,如下所示:

class Photos < ActiveRecord::Base

  belong_to :venue
  validate_on_create :photo_count_within_limit

  def photo_count_within_limit
    if self.venue.photos(:reload).count >= self.venue.photo_limit
      errors.add(:base, "Exceeded venue photo limit")
    end
  end

end
于 2011-10-22T20:37:21.300 回答
-1

在我目前的项目中,我们有同样的问题。我没有参与那部分,所以我不知道它是如何解决的。也许在 ApplicationController 上使用某种全局过滤器来检查用户当前计划/子计划(是的,我们也有子计划)的权限。

周一我会尝试找一些时间来检查我们如何实现这一点并回答你。

于 2011-10-22T20:31:09.893 回答