--- title: 20200817 Astro Camp gems tags: Astro Camp, rails --- # 20200817 Astro Camp gems #### [go rails](https://gorails.com/) #### [raiils cast](http://railscasts.com/) attr_reader? ## state machine 狀態機 當今天要更改訂單的狀態,可能要先判斷訂單的狀態才能更改,而手動切換的時候可能會造成問題,或是要寫很多判斷式。 ### [aasm](https://rubygems.org/gems/aasm/versions/4.11.0?locale=zh-TW) 幫狀態之間設定好軌道!只能照著軌道來 在想設定狀態機的model裡 ```ruby= class Board < ApplicationRecord include AASM aasm(column: 'state') do state :normal, initial: true #設定初始狀態 state :hidden, :locked #列出其他狀態 #--------建立@board的實體方法-------------- event :hide do transitions from: [:normal, :locked], to: :hidden #@board.hide! 可以將狀態從normal或locked設定成 hidden end event :show do transitions from: :hidden, to: :locked end event :lock do transitions from: [:normal, :hidden], to: :locked after_transaction do puts "已鎖版!" end end event :unlock do transitions from: :locked, to: :normal end end end ``` 同狀態不能切換,會噴錯,像是normal切normal,所以要去用if設定切換狀態失敗的時候轉址! ```ruby= #board_controller內 def hide @board.hide! if @board.may_hide? #may_hide?可以查詢是否能切換狀態! redirect_to boards_path, notice: '看板已隱藏' end ``` #### *lock 方法打架了!*  **每個model預設有lock的方法,在assm裡面用lock當方法會覆寫,所以取名要注意。** ## 自動幫資料長分頁! ### [kaminari](https://github.com/kaminari/kaminari/) 在controller裡撈資料的時候設定 ```ruby= @boards = Board.normal.page(params[:page]).per(2) #將normal狀態的board撈出來,每一頁顯示2筆 #kaminari將路徑設定成/boards?page=1,所以可以用paramas抓 ``` 也可以在model下設定 ```ruby= paginates_per 7 #每一頁顯示7筆,controller裡也可以設定,但只會取最小值 ``` 以上面的例子,兩段code來說,每一頁只會顯示2筆 其他方法記得去看文件! ## 權限管理系統 將user增加一欄role: * normal ->不能開版 * plan_a ->可以開兩個版 * plan_b -> 無開版限制 ### [cancancan](https://github.com/CanCanCommunity/cancancan/) [cancan](https://github.com/ryanb/cancan/) 上一代,沒有在更新了 [pundit]() 適合新手! 跟devise有整合,裡面的user都是current_user,若沒有使用devise,要記得做給他! 會建立policy,在裡面定義你的會員權限 傳symbol 會去找board的policy ```ruby= <% if policy(:board).create? %> <% end %> ``` 傳model 會去找@board的model的policy ```ruby= <% if policy(@board).create? %> <% end %> ``` ## Mails self_reference reply_id ## payment get payment?plan=a brain-tree  ## figaro 把key放到secret file,順便把它放到git_ignore,不會被push到github
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up