这个 Gem 是用来给 ActiveRecord
做设置项存储的,数据保存在数据库里面,读取将会有自动缓存。
https://github.com/huacnlee/rails-settings-cached
用法:
class Setting < RailsSettings::CachedSettings
end
$ rails c
ruby> Setting.foo = "bar"
ruby> exit
$ rails c
ruby> Setting.foo
bar
更多用法,参见 Github 上面的 README 文档。
如果要在 form 里编辑某些选项呢?我能想到的是用 activemodel 封装,加验证,数据实际是从 setting 加载,最后保存到 setting
有个问题:在使用rails g settings foobar
之后,生成的 Model,默认不是带缓存的:
class Foobar < RailsSettings::Settings
end
修正的话,也比较简单,修改一下 generator 里面的 model.rb 文件就好。
@huacnlee 提交了一个 pull request: https://github.com/huacnlee/rails-settings-cached/pull/7
项目中用到这个 gem,小小贡献一下。
昨天遇到一件特别奇怪的事情。 使用插件 rails-settings-cached 在管理界面 做了一个表单提交 配置。
class Admin::SettingsController < Admin::BaseController
def config
params[:setting].each do |k,v|
Setting[k] = v
end
flash[:notice]='update setting success.'
redirect_to :back
end
end
params = {:setting => {:dollar_rate => "6.3684"}}
这个时候 params[:setting] 会死循环,挺奇怪的。 当我把 action 名称“config”换成别的名称 就正常了。难道 config 是关键字不能做 action?
@huacnlee 请教一个问题,刚刚使用了这个 gem。有一个小问题,我在测试里面修改了某个设置(比如 Setting.repo),发现在其他环境中 (development) 修改依然有效,是不是没有区分环境?有什么建议的做法来再测试中使用不同的配置?
# config/config.yml
public:
smtp_server: 'mail.agideo.com'
test:
smtp_server: 'mail.agideo.com'
development:
smtp_server: 'mail.agideo.com'
production:
smtp_server: 'mail.agideo.com'
# config/initializers/init_setting.rb
APPCONFIG = YAML.load_file("config/config.yml")["public"].merge(YAML.load_file("config/config.yml")[Rails.env])
@huacnlee 默认值可以限制在不同的 model 里面吗?在 config/initializers/default_settings.rb 的设置好像对所有 include RailsSettings::Extend 的 model 都是有效的。 比方说,用户有默认性别 gender,公司有默认规模 staff_count,这样@user.settings[:staff_count] 能得到值,总感觉怪怪的。 能不能像添加类似 ledermann / rails-settings 里面的设置,默认值是可以有 scope 的
class User < ActiveRecord::Base
has_settings do |s|
s.key :dashboard, :defaults => { :theme => 'blue', :view => 'monthly', :filter => false }
s.key :calendar, :defaults => { :scope => 'company'}
end
end