新手问题 那些不常更改的内容,你们怎么设置的?

chairy11 · 2015年04月27日 · 最后由 chairy11 回复于 2015年04月28日 · 2684 次阅读

比如做个公司门户网站,有些页面很静态,比如什么「关于我们」,关于公司的简介啊、地址啊、电话啊,这些东西其实不怎么变化。 但为防万一,又得有个地方让它可以编辑。

不知道是不是如果用 mongodb 做数据库,这种一次性的东西用键值对存储很方便? 但我用了 mysql。 所以我目前的方案是存入一个 setting.yml,然后用CONFIG[:key]来读取。 实现之后,想了想,应该从 web 界面配置吧? 那我应该自己弄个方法,先从 yml 读取到 form 上,编辑完,put 到 server,然后再把数据写入 yml?

然后我发现了一个 GEM, configurable_engine,貌似就是能从界面设置 yml 的。 正准备尝试。搜了搜,人气不是很高。 大家都怎么处理这些事情的?用过这个 GEM 吗? 有什么好推荐吗?

另外,很多人推荐Figarodotenv, 好像人气更旺一点。但它们没有打包界面实现功能?

还看到RailsCasts: #336 Copycopter, 但这个看起来好诡异,要单开一个 server,没看懂……但感觉也不方便……

= = 你建一个 pages 的表存起来就行了,然后加上缓存。存成文件什么的更复杂。

我也有类似问题,比如一个类似分类的问题。

如果放 数据库,每次读取出来都要访问数据库,如果 yml 写死了,更新就要改源代码。

我的想法是存在数据库,然后一个 action 写到缓存,不知道有没有 best practice

class DataConfig < ActiveRecord::Base

  SMS = %w{ 容联 云片 }

  store :details, accessors: [:sms, :about, :phone, :desc], coder: JSON

  scope :current_config, -> { first }

end

#3 楼 @kewin 没懂……原理是什么?

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,最好还能设置图片。

#4 楼 @42thcoder 哭……看不懂……

#6 楼 @chairy11

基本思路是新建一张表,来存储配置。借助store, 在字段中存储 JSON 格式的数据,accessors 定义了可能存在的 key. accessors 中定义的 key 可以随意删减,同时支持在前端 form 直接读写。

按我上面给出的例子,你可以 DataConfig.current_config.update!(about: '简介', phone: 110), 也可以 DataConfig.current_config.about

具体使用,你看 API 吧。

給別人做的那麼還是新建page數據表或者直接post數據表,post_typepage. 自己做主要看前端,那就沒所謂了。我做過的通常都是這樣乾的,至於寫入文件,這事我也幹過。比如寫進 yaml.

挂个 CMS 进去..

直接 html, 要改的时候收维护费。

静态页面做一个 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 项,在里面也可以编辑。 但缓存是什么个思路呢?

#13 楼 @chairy11 第一个问题,看 Ruby China 的 Page 功能 第二个问题,你一定没看我贴的连接,那就是你想要的

#14 楼 @huacnlee 链接我看了呀,现在脑子有点乱嘛……我知道你写的这个就叫「rails-settings-cached」,肯定是缓存很棒罗,可是我看不懂嘛,所以想着有什么深入浅出的思路嘛…… 我意思是,我本来想自己有针对性的写一个,然后就不用这些 gem 了……

#14 楼 @huacnlee 555,头疼……看 ruby-china 的 page 功能,好像它直接用 mongodb 存的 body_html. 但我做的这种小网站吧,每个页面的样式都不一样,比如「关于我们」「联系我们」「首页」,我想让他们能改的就是其中一些文字。别的也不轻易让他们改,免得把我设计破坏了……

我再好好学习一下哦……

#16 楼 @chairy11 可以使用这个 gem 来做静态页面 high_voltage

#17 楼 @foxzool 没看到有什么特别呀……它是把整个页面的 html 存进数据库还是咋的? 我页面已经完全写好了,只是想弄个方案,让人们能改改其中的文字。 好像 CMS 们都是所见即所得地改,但对我来说好像太高级了点…… 我现在想的是在后台 admin 下面来个页面,集中修改这些不常修改的地方……

不要光说不练,你试试啊

#18 楼 @chairy11 就是一个单纯的静态页面管理 gem,一个页面一个独立的 view,放放公司简介什么的足够了。

#19 楼 @huacnlee 哦……人家水平不够嘛……

需要 登录 后方可回复, 如果你还没有账号请 注册新账号