我有一个使用 rails_admin ( https://github.com/sferik/rails_admin ) 作为后端的 Ruby on Rails 应用程序。
我有一个模型叫banner,所以数据库中有一个表叫banners。管理员可以创建尽可能多的横幅,也可以删除它们。但我想修复 3 中的横幅数量。我想要 3 个横幅(已经创建),并且我希望管理员不能创建或销毁任何横幅。
有人可以帮助我吗?
谢谢!
我有一个使用 rails_admin ( https://github.com/sferik/rails_admin ) 作为后端的 Ruby on Rails 应用程序。
我有一个模型叫banner,所以数据库中有一个表叫banners。管理员可以创建尽可能多的横幅,也可以删除它们。但我想修复 3 中的横幅数量。我想要 3 个横幅(已经创建),并且我希望管理员不能创建或销毁任何横幅。
有人可以帮助我吗?
谢谢!
@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 。
救援验证:
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
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 << ,您就可以保证任何事物都将始终具有三个横幅。