时间:2011-10-22 20:17:07

标签: ruby-on-rails ruby-on-rails-3 limit cancan restriction

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

我正在使用康康宝石为场地分配角色,具体取决于他们的计划(免费,高级,高级+)。

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

e.g。

  • 我希望所有场地都有照片,但免费场地应该是 仅限于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

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

2 个答案:

答案 0 :(得分:2)

我会为photo_limittag_limit等提供场地模型方法。

class Venue < ActiveRecord::Base

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

end

(这假设.plan方法将返回当前Venue的计划)

然后在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

答案 1 :(得分:-1)

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

星期一,我会试着找一些时间来检查一下我们如何实现这个并回答你。