比如做个公司门户网站,有些页面很静态,比如什么「关于我们」,关于公司的简介啊、地址啊、电话啊,这些东西其实不怎么变化。 但为防万一,又得有个地方让它可以编辑。
不知道是不是如果用 mongodb 做数据库,这种一次性的东西用键值对存储很方便?
但我用了 mysql。
所以我目前的方案是存入一个 setting.yml,然后用CONFIG[:key]
来读取。
实现之后,想了想,应该从 web 界面配置吧?
那我应该自己弄个方法,先从 yml 读取到 form 上,编辑完,put 到 server,然后再把数据写入 yml?
然后我发现了一个 GEM, configurable_engine,貌似就是能从界面设置 yml 的。 正准备尝试。搜了搜,人气不是很高。 大家都怎么处理这些事情的?用过这个 GEM 吗? 有什么好推荐吗?
另外,很多人推荐Figaro和dotenv, 好像人气更旺一点。但它们没有打包界面实现功能?
还看到RailsCasts: #336 Copycopter, 但这个看起来好诡异,要单开一个 server,没看懂……但感觉也不方便……
我也有类似问题,比如一个类似分类的问题。
如果放 数据库,每次读取出来都要访问数据库,如果 yml 写死了,更新就要改源代码。
我的想法是存在数据库,然后一个 action 写到缓存,不知道有没有 best practice
class DataConfig < ActiveRecord::Base
SMS = %w{ 容联 云片 }
store :details, accessors: [:sms, :about, :phone, :desc], coder: JSON
scope :current_config, -> { first }
end
create_table :settings do |t|
t.string :var, :null => false
t.text :value
t.references :target, :null => false, :polymorphic => true
t.timestamps :null => true
end
add_index :settings, [ :target_type, :target_id, :var ], :unique => true
看它里面的表,是指,建一个表,这个表的四个字段,一个是 key,一个是 value,这两个合起来是 setting 的键值对,然后多态映射,记下它的目标的 class 和 id?
那倒跟我前面的思路有一点点像。我一开始是准备建个表,
create_table :elements do |t|
t.string :name
t.text :content
t.timestamps null: false
end
然后给它一个唯一的名称,比如「关于我们」页面上的公司地址对应存入的是:name: "about_us_address"
content: "北京市长安街一号"
。
然后通过 Element.where(name: 'about_us_address').take 来找。
可是后来想想,好像效率很低而且好傻哦……
然后又重新找方案……
其实我的重点是要通过 web 界面能设置的,可能有三种,一种是 string,一种是 txt,最好还能设置图片。
基本思路是新建一张表,来存储配置。借助store
, 在字段中存储 JSON 格式的数据,accessors
定义了可能存在的 key.
accessors
中定义的 key 可以随意删减,同时支持在前端 form 直接读写。
按我上面给出的例子,你可以 DataConfig.current_config.update!(about: '简介', phone: 110)
, 也可以 DataConfig.current_config.about
具体使用,你看 API 吧。
給別人做的那麼還是新建page
數據表或者直接post
數據表,post_type
是page
.
自己做主要看前端,那就沒所謂了。我做過的通常都是這樣乾的,至於寫入文件,這事我也幹過。比如寫進 yaml.
静态页面做一个 Page 表 内容少的设置项用 https://github.com/huacnlee/rails-settings-cached
Setting.admin_password = 'supersecret'
Setting.date_format = '%m %d, %Y'
Setting.cocktails = ['Martini', 'Screwdriver', 'White Russian']
Setting.foo = 123
Setting.credentials = { :username => 'tom', :password => 'secret' }
#12 楼 @huacnlee 静态页面做一个 Page 表是什么意思呢?
之前我尝试的configurable_engine, 生成的 value 字段用的是 string,我要存 html 不够用。 看你的 gem 不太看懂,但看你的 value 字段倒是 text,但我想想,好像我主要是针对静态页面的修改,没什么用到多态的地方……
create_table :settings do |t|
t.string :var, null: false
t.text :value, null: true
t.integer :thing_id, null: true
t.string :thing_type, null: true, limit: 30
t.timestamps
end
我在想,要不要按我原来的思路,来一个 element model,统统管理了,写进 mysql,就不用 yml 了。
create_table :elements do |t|
t.string :name
t.text :content
t.timestamps null: false
end
因为我还有很多 html 项,在里面也可以编辑。 但缓存是什么个思路呢?