0

我有一个使用 rails_admin ( https://github.com/sferik/rails_admin ) 作为后端的 Ruby on Rails 应用程序。

我有一个模型叫banner,所以数据库中有一个表叫banners。管理员可以创建尽可能多的横幅,也可以删除它们。但我想修复 3 中的横幅数量。我想要 3 个横幅(已经创建),并且我希望管理员不能创建或销毁任何横幅。

有人可以帮助我吗?

谢谢!

4

3 回答 3

0

@RadBrad 指出您可以has_many在代表三个横幅集的另一个模型上使用这一点。也许可以称它为 BannerSet 或类似的。您可以像他说的那样一次创建三个,或者在 BannerSet 验证中,您可以确保只有 3 个相关联的横幅。

您甚至可以在 BannerSet 模型上拥有 3 个属性(列),这些属性(列)将具有横幅的 3 个 id。如果您确定它将始终是 3 个横幅,那么这也可能是一个不错的设计。

但是,如果你只有一个 Banner 控制器,你会怎么做,这不是最好的方法,你会看到。

首先,您可以在控制器中使用声明式授权:

authorization do
  has_permission_on :banners, :to => [:new, :create] do
    Banner.count < 3
  end
end

为确保即使在您进入创建屏幕添加横幅后仍无法添加横幅,还要向横幅模型添加验证:

before_create :validate_max_banners

def validate_max_banners
  errors.add_to_base("Only 3 banners are allowed.") if Banner.count == 3
  errors.empty?
end

不过,两者都不能完全确保您在该表中只能有 3 行。为此,您需要在数据库端使用触发器或类似工具,如本 q&a中所述。但是,对于一个基本的解决方案,这可能没问题。

请注意,尽管RailsAdmin可以很容易地配置和自定义(请参阅其wiki以获取文档),但如果您需要更多自定义,我也会考虑使用ActiveAdmin 。

于 2013-02-22T18:40:09.440 回答
0

救援验证:

class Thing < Active Record::Base
  has_many :banners

  validate :banner_count

  private
    def banner_count
      errors.add(:base, "Banner count must be 3") unless self.banners.count == 3
    end
end
于 2013-02-22T18:10:10.853 回答
0
 class Thing < ActiveRecord::Base
   has_many :banners
 end

应用程序/控制器/things_controller.rb

 def create
   @thing = Thing.new
   @thing.banners << Banner.new(:name=>'Banner 1',....)
   @thing.banners << Banner.new(:name=>'Banner 2',....)
   @thing.banners << Banner.new(:name=>'Banner 3',....)
   @thing.save
 end

现在,只要您没有在其他地方调用 @thing.banners << ,您就可以保证任何事物都将始终具有三个横幅。

于 2013-02-22T17:59:19.263 回答