Your posts match “ Badge ” tag:

Merit -- Rails badge system

為了某個專案必須實做所謂的「勳章系統」,稍微搜尋了一下發現 Merit 這套勳章系統,所以就直接套到開發中的專案上了。

Merit 因為才剛摸,我大概就只接觸了 Badge 功能,但是它還有 PointRanking 可以玩,之後我可能再補上相關的說明。

安裝 merit

  1. 在 Gemfile 中新增 gem 'merit'
  2. 執行 rails g merit:install
  3. 如果你要把勳章綁在 User 上就執行 rails g merit User
  4. 接著執行 rake db:migrate
  5. 編輯 #{Rails.root}/config/initializers/merit.rb -- 等等會解釋
  6. 編輯 #{Rails.root}/app/models/merit/* -- 等等會解釋

新增勳章

接下來來解釋一下步驟 5 的用途。

打開 #{Rails.root}/config/initializers/merit.rb 後你可以看到其實註解已經把設定講得算是蠻清楚的了,在 Merit.setup 的部分如果你的會員系統是用 devise 串且是掛在 User model 上的話這邊基本上都不需要改,但是如果你用的不是 ActiveRecord 而是 mongodb 的話,也是有選擇可以使用。

接下來講一下勳章新增的方式,其實語法就

Merit::Badge.create!({
  id: 1,
  name: "vip",
  level: 0,
  image: '/badges/vip-0.png',
  description: "加入會員, 成為酷客一員",
  custom_fields: { display_name: "會員勳章" }
})

這樣而已,你可以自己指定 level 等資訊,值得一提的是 custom_fields ,如果你需要串其他東西可以直接在裡面塞。

然後 name 這個欄位會跟步驟 6 設定的東西有關,所以我就設定英文了。

設定規則

取得勳章一定會有規則,那規則的設定則是寫在 #{Rails.root}/app/models/merit/badge_rules.rb 內。

如果每個剛註冊好的使用者都可以得到一個勳章的話,可以這樣寫:

grant_on 'users/registrations#create', badge: 'vip', model_name: 'User'

簡單解釋一下:

grant_on ROUTE, badge: BADGE-NAME, model_name: MODEL-NAME

  • ROUTE: 經過什麼 Controller / Action 後條件符合就會指派
  • BADGE-NAME: 被指派的勳章名稱,名稱就是步驟 5 中設定的 name
  • MODEL-NAME: 如果 model 與 route 同名的話,這邊不用設定,但是不同名的話就要指定了

除此之外還有其他參數可以設定

  • to: 指派給「誰」,這邊我還沒有特別玩過,如果沒指派的話預設值就是看誰去觸發 Rule 就是指派給誰
  • temporary: 有一些論壇系統有一種功能,就是當你積分到達多少的話你就會是怎樣的會員,但是如果減少到某個級別以下的時候會員等級會往下掉或者勳章取消,當這個欄位設定為 true 的時候就能夠有這種效果。
  • level: 指派第幾級的勳章
  • &block: 當有 block 的時候就可以檢查該物件是否符合某些條件,譬如說 user.comments.count === 10

與 devise 串一起的其他注意事項

這邊我測很久 .... 因為 grant_on 第一個參數吃的是 Rails route ,所以只要 Controller / Action 不對就永遠吃不到,這時候如果你要讓 devise 可以一起運作的時候你就一定要記得 overwrite Controller ,不可以用 devise 自己內建的來玩,不然會玩到天荒地老。

這部分可以參考 https://github.com/tute/merit/wiki/How-to-grant-badges-on-user-registration-using-Devise,但是裡面是錯的 ... XD

我剛有說,一定要 Controller#Action 正確,不然會吃不到,所以它的 grant_on 一定要寫成 users/registrations#create ... 如果寫成 registrations#create 就會永遠吃不到。