Rails应用程序网站范围设置可从前端编辑

时间:2015-01-13 19:41:05

标签: ruby ruby-on-rails-4 activemodel

我有一个小的 Rails 4.2 应用,它有一些我希望在网站范围内更改的设置,例如 start_time: time, finish_time: time, disabled: boolean

我知道我可以创建一个名为AppSettings的模型并在其中包含这些字段,但我只想要一个实例可用,因为它们应该是网站范围的

这种模式的可接受方法是什么?

我还应该提到这些设置需要从前端更新。

1 个答案:

答案 0 :(得分:1)

看起来Rails的新自定义配置是你想要的,具体取决于你的用例。

https://github.com/rails/rails/commit/611849772dd66c2e4d005dcfe153f7ce79a8a7db

Rails.configuration.x.start_time = Time.now

等等。您可以从应用程序的任何位置访问此配置,并且在任何时间点只会有一个实例。

如果这不符合您的使用案例,可能还有其他选择。

修改

为了真正回答OP的更新问题,我可以想出两种方法来实现持久的配置。

每个配置值一行

创建一个模型/表格,其中包含设置name的列和设置value

然后您的模型可以确保并确认每个设置只有一行,并确保正确读取/写入设置。

class AppSettings < ActiveRecord::Base
  validate_uniqueness_of :name

  def self.[](setting_name)
    find_by_name(setting_name) or raise ActiveRecord::RecordNotFound, "cannot find setting for #{setting_name}"
  end
end

这样做的两个缺点是,您需要确保每个设置都转换为正确的类型,并且每次需要设置时都会访问数据库。

单行表

这将允许您为每个设置添加一个列,但缺点是您需要确保表中只有一行,除非您需要在应用程序逻辑中设置多个设置。

为了确保只使用一行,您必须创建一个仅对该行执行查询的接口。像这样的东西

class AppSettings < ActiveRecord::Base
  def self.current
    first_or_create(setting_one: "default", setting_two: "another")
  end
end

然后,您只需要确保在AppSettings模型中使用current类方法时。