Coding - 碼農筆記 / ruby & rails / 常用筆記

Rails筆記

routing 的 namespace

Namespace是Scope的一種特定應用,特別適合例如後台介面,這樣就整組controller、網址path、URL Helper前置名稱`都影響到:

  namespace :admin do
    resources :projects
  end

如此controller會是Admin::ProjectsController,網址如/admin/projects,而URL Helper如admin_projects_path這樣的形式。

 

before_action 的使用時機

是一個常見的 controller 技巧,用來收納重複的程式碼,最常用於準備跨Action共用的資料,或是使用者權限驗證等等

session 與 cookie 的差別

當Server想要保存使用者的某些狀態,如登入資訊,頁面風格時,會發送Cookie給Client。Cookie通常是一份數對,有Cookie名與相對應的值,而Cookie會在使用者本地端的電腦系統裡保存。之後當使用者瀏覽同一網頁時,Cookie值便會隨著請求發送,如此Server就能根據Cookie值進行操作。在使用Cookie時,最主要的問題在於Cookie是以明文的方式在網際網路上傳輸及在客戶端電腦儲存,因此我們建議儘量避免使用Cookie儲存敏感的資料。

Session與Cookie最主要的差異在於Session是保存在Server端,而不是Client端。但事實上在使用Session時仍需要配合Cookie使用。相對於Cookie,Session多用來儲存敏感性的資料,實用性較高也因此常常會成為攻擊者的目標。

Rails 內如何操作 session?

HTTP是一種無狀態的通訊協定,為了能夠讓瀏覽器能夠在跨request之間記住資訊,Rails提供了Session功能,像是記住登入的狀態、記住使用者購物車的內容等等,都是用Session實作出來的。

Session 僅在 Controller 與 View 裡面可以使用
要操作Session,直接操作session這個Hash變數即可。例如:
session[:cart_id] = @cart.id

如何讓 strong_parameter 接受 nested_attributes

在model中
accepts_nested_attributes_for :info

在controller中

def product_params
    params.require(:order).permit(info_attributes: [:billing_name,
                                                    :billing_address,
                                                    :shipping_name,
                                                    :shipping_address] )
end

board has_many posts, 新造物件宣告方式是: @post = @boards.posts.build 。那如果 book has_one :author,請問要怎麼宣告?

二種方式皆可
@author = @book.author.build
@author = @book.build_author

after_create 是一種 model callbacks, 請問 model 有多少種 call backs 請列出來

以下是 Active Record 可用的回呼,依照執行順序排序:
1-新建物件

  • before_validation
  • after_validation
  • before_save
  • around_save
  • before_create
  • around_create
  • after_create
  • after_save
  • after_commit/after_rollback

2-更新物件

  • before_validation
  • after_validation
  • before_save
  • around_save
  • before_update
  • around_update
  • after_update
  • after_save
  • after_commit/after_rollback

3-刪除物件

  • before_destroy
  • around_destroy
  • after_destroy
  • after_commit/after_rollback

4-after_initialize** **after_find

5-after_touch

(in controller ) render 與 redirect_to 的差異

render :
render方法會回傳預設的Template
依照Rails慣例就是app/views/{controller_name}/{action_name}
以下參數可以使用:
直接回傳結果

  • render :text => “Hello” 直接回傳字串內容,不使用任何樣板。
  • render :xml => @event.to_xml 回傳XML格式
  • render :json => @event.to_json 回傳JSON格式(再加上:callback就會是JSONP)
  • render :nothing => true 空空如也

redirect_to
如果Action不要render任何結果,而是要使用者轉向到別頁,可以使用redirect_to

db 的 transaction 是什麼?

Transaction(交易)保證所有資料的操作都只有在成功的情況下才會寫入到資料庫,最著名的例子也就是銀行的帳戶交易,只有在帳戶提領金額及存入帳戶這兩個動作都成功的情況下才會將這筆操作寫入資料庫,否則在其中一個動作因為某些原因失敗的話就會放棄所有已做的操作將資料回復到交易前的狀態。

其他筆記

  • yml檔要空二格才能正確執行
  • 在.gitignore 裡要加進 config /database.yml 避免密碼被看到
  • 如何做數字的千分位http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html
  • 顯示目前資料庫 migrate 狀態: rake db:migrate:status
  • 之前不完整的訂單 (少了user_id)要清掉所有的訂單
    • rails c
    • Order.destroy_all
  • 資料庫重建

    • Rake db:drop
    • Rake db:migrate
    • Rake db:seed
  • 訂單資料並沒有 token 的值,要把所有沒有 token 值得訂單資料刪掉

    • rails c
    • Order.where(token: nil).destroy_all
© 2024 胡同筆記 | WordPress Theme: Cosimo by CrestaProject.