Wikiをつくる(ユーザーの招待機能について) - Qiitaの続き
欲しかったもの
サイトのタイトル、説明や何かのフラグなどを簡単に保存しておく方法が欲しかった。
やれることとしては「config」というgemが近いのだけど、これはYAMLにデータを保存する形式。変更しないデータについては便利なのだけど、アプリ利用者が更新するには向いていない。
使い方としてはOption.site_title
で参照できて、Option.site_title = "hoge"
などで保存できるようなものがよい。
作ったもの
このようなTableはWordpressを参考にさせてもらい下記のようなものを用意した。key
やvalue
はMySQLの予約後なのでoptionというプリフィックスをつけた。
create_table "options", force: :cascade do |t|
t.string "option_key", default: "", null: false
t.text "option_value", default: "", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
そして、モデルをこのようにした。method_missing
で拾う方式だ。
lokka/option.rb at master · lokka/lokkaでやっているのを参考にRailsで置き換えた。
class Option < ApplicationRecord
def self.method_missing(method, *args)
attribute = method.to_s
if attribute =~ /=$/
column = attribute[0, attribute.size - 1]
o = self.find_or_initialize_by(option_key: column)
o.option_value = args.first.to_s
o.save
else
o = self.find_or_initialize_by(option_key: method.to_s)
o.option_value
end
end
end
何か弊害がないか心配だった心配だったが特に問題なさそうなのでこのようにした。
次のように意図通り動くようになった
[16] pry(main)> Option.foo
=> ""
[17] pry(main)> Option.foo = 'bar' #代入してみる
=> "bar"
[18] pry(main)> Option.foo #参照できるようになった
=> "bar"