| ?請求(request)信息 |
| ?獲取請求信息? | ?params[:參數名]
| ?可以獲得的信息 | ? | ?主機信息 | ?《form method="POST"》下定義的表格傳送來的信息 | ?詢問信息 ?query | ?url后面 ?鍵名=值&...下面的信息 | | ?路徑參數 | ?路徑/books/1這樣的1的部分 |
| | ?數組 | ? | ?路徑 | ?key后面加[] 例: /...?sampleArray[]=...&... | | ?方法參數 | ?還是單純的符號(symbol) params[:sampleArray] |
| | ?哈希表 | ?
| ?路徑 | ?key后面加上[哈希值] 例: /...?hashArray[hashVal]=...&... | | ?方法參數 | ?還是單純的符號(symbol) params[:hashArray] |
| | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
|
?指定可以獲取的數據 ?黑白名單 | ? params.require(model).permit(attr,...)
| ?參數 | ? | ?model | ?模型名? | | ?attr, ... | ?允許獲取的屬性值的哈希值(符號symbol) | | ? | ? | | ? | ?? | | ? | ?? |
| | ?遇到獲取不允許值時指定處理 | ?默認拒絕 ?config.action_controller.action_on_unpermitted_parameters | | ? | ? | | ? | ? | | ? | ? |
|
| ?獲取頭信息 | ? | ?頭信息 | ?附加的一系列和用戶操作無關的信息 | | ?例 | ?客戶端(瀏覽器)對應的語言,瀏覽器種類,鏈接地址等 | | ?其他 | ?請求時的成為請求頭信息 (request header information) | | ? | ? | | ? | ? |
?request.headers['...']
| ?主要的頭信息標簽 | ? ?內部名 HTTP_.... ?例子: HTTP_ACCEPT_LANGUAGE
| ?Accept | ?客戶端支持的內容種類? | | ?Accept-Language | ?客戶端支持的語言(按優先度排) | | ?Authorization | ?證書信息 | | ?Host | ?請求的主機信息 | | ?Referer | ?鏈接信息 | | ?User-Agent | ?客戶端種類 | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
| ?還可以獲取服務器環境變量 ?request.headers['...'] | ? | ?GATEWAY_INTERFACE | ?CGI的校對
?返回值例:? ? ?CGI/1.2 | | ?QUERY_STRING | ?請求信息 ?返回值例:? ? ?id=1 | | ?PATH_INFO | ?路徑信息 ?返回值例:? ? ?/ctrl/req_head2 | | ?REMOTE_ADDR | ?客戶端的ip地址 ?返回值例:? ? ?::1 | | ?REQUEST_METHOD | ?HTTP方法 ?返回值例:? ? ?GET | | ?REQUEST_URI | ?請求是的url ?返回值例:? ? ?/ctrl/red_head2?id=1 | | ?SERVER_NAME | ?服務器名 ?返回值例:? ? ?localhost | | ?SERVER_PORT | ?服務器接口號 ?返回值例:? ? ?3000 | | ?SERVER_PROTOCOL | ?服務器用的協議 ?返回值例:? ? ?HTTP/1.1 | | ?SERVER_SOFTWARE | ?使用的服務器軟件 ?返回值例:? ? ??puma 3.6.0 Sleepy Sunday Serenity | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
| | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
|
| ?獲取頭信息和服務器信息的專用方法 | ?#TODO: ?F2634985-5CD9-4CBD-B8E0-C7B7A4184923 ?p333~334 ?因為上面的也可以用,暫時省略 |
| ?文件上傳? | ?傳上的文件的接收 ?form_tag/for ...multipart: true do ? ? ?... ? ? ?submit_tag ? ? ?... ?end ?form_tag ?form_for 選項設置 | ?必須 multipart: true | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
|
| ?上傳的文件方法 | ?類型UploadedFile
| ?original_filename | ?源文件名 | | ?content_type | ?內容的類型 ?? | | ?size | ?大小
?1.megabyte這樣來進行比較 | | ?read | ?讀取文件內容 | ?File.extname(...).downcase ?File.extname(...).upcase | ?獲取文件拓展名 ?注意:參數應該是文件名 | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | File.extname(你的文件.original_filename).downcase |
?文件保存 ?本地系統 | ?File.open("/Users/xxxx/Desktop/github/Learning-Ruby/File/#{name}", 'wb') do |file| ? ?file.write(upload.read) ?end |
?文件保存 ?數據庫 | ?# TODO: p337~339 |
| ?獲取文件后綴 | ?File.extname(你的文件.original_filename).downcase |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ?? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ?回應(response)的操作 |
| ?response | ?返回處理的結果等 |
| ?概覽 | ? | ?render | ?呼出模板/文本/腳本等,輸出通用的結果 | | ?redirect_to | ?向指定地址重定向 | | ?send_file | ?輸出文件 | | ?send_data | ?輸出二進制文件 | | ?head | ?只輸出回應的頭信息?(応答ヘッダー)? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
|
| ?render(1) | ?最常用。 ?如果沒有呼出,則默認呼出這個,執行設定好的模板(get '.../...') 呼出模板的用法 | 呼出同一個視圖控制器的模板(templata)? | ?render action:?'t1' | | 呼出其他視圖控制器的模板(templata) | ?render template: 'sample/t1' | | 呼出應用外部的模板(templata) | ?render file: '...' ?絕對路徑 ?多個應用共有一個模板時候用 | | ?三個的符號都可以省略 | ? | | ?呼出部分模板 ?傳送門 | ?? | ?位置 | ?模板內(layout或者部分模板template) | | ?文件命名規則 | ?開頭帶_ /../_sample.html.erb ? | | ?呼出方法 | ?render url ?render partial: url render "sample"
render partial: "sample" ?注: ● 全體通用的(/app/views/ application)看做全體的部分模板, ?呼出不需要相對路徑 ●?路徑是?/app/views/后面的相對路徑 ●?和主模板在一個文件夾的呼出時可以省略到該文件夾部分 ? |
? | | ? | ? | 注意: render默認放回200(:ok)狀態碼,可以通過status: 選項自己指定 |
| ?render(2) | ?直接輸出 ?只用在debug ?會使layout無效
?輸出純文本 ?無視一切符號的意義 | ?render plain: '...' | ?輸出純文本 ?有符號的意義 | ?render html: '...'.html_safe | | ?用erb輸出 | ?render inline: '...' ?erb的代碼字符串? | | ?主要 | ?這三個都會使layout無效 ?因為這是debug ?如果需要layout,要自己制定 | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | 注意: render默認放回200(:ok)狀態碼,可以通過status: 選項自己指定 |
| ?head | ?只返回狀態碼 ?head status [, opt]
| ?參數 | | ?status | ?狀態 數值或者符號 | | ?opt | ?應答頭(応答ヘッダー) ?頭: 值的形式 |
| | ?status | ? | ?符號 | ?狀態碼 | ?含義? | | ?:ok | ?200? | ?成功? | | ?:created | ?201? | ?資源生成成功 | | ?:moved_permantly | ?301? | ?資源永久性移動了? | | ?:found | ?302? | ?資源暫時移動了? | | ?:see_other | ?303? | ?資源在其他地方? | | ?:unauthorized | ?401? | ?要認證? | | ?:forbidden | ?403? | ?訪問被禁止 | | ?:not_found | ?404? | ?資源不存在? | | ?:method_not_allowed | ?405? | ?HTTP方法不被允許 | | ?:internl_server_error | ?500 | ?サーバーエラー | | ? | ? | ? | | ? | ? | ? | | ? | ? | ? | | ? | ? | ? |
| | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
|
| ?redirect_to | ?返回結果并且重定向 ?redirect_to url [,status=302]
| ?url | ?和url_for一樣的參數
| ?controller | ?視圖控制器名 | | ?action | ?動作(方法名)(controller#method) | | ?host | ?主機名(覆蓋現在的主機) | | ?protocol | ?協議名(覆蓋現在的協議) | | ?anchor | ?錨名? | | ?only_path? | ?是否返回相對url(是否省略協議/主機/接口) ?不指定host的話默認true | | ?trailing_slash | ?末尾要不要/ ?默認false | | ?user | ?HTTP識別用的用戶名 | | ?password | ?HTTP識別用的密碼 | | ?只指定一個:back | ?鏈接向之前一個鏈接? ?(返回Referer header) |
| | ?status | ?數字或者符號
| ?符號 | ?狀態碼 | ?含義? | | ?:ok | ?200? | ?成功? | | ?:created | ?201? | ?資源生成成功 | | ?:moved_permantly | ?301? | ?資源永久性移動了 ?crawler記錄 | | ?:found | ?302? | ?資源暫時移動了? ?crawler不記錄 | | ?:see_other | ?303? | ?資源在其他地方? | | ?:unauthorized | ?401? | ?要認證? | | ?:forbidden | ?403? | ?訪問被禁止 | | ?:not_found | ?404? | ?資源不存在? | | ?:method_not_allowed | ?405? | ?HTTP方法不被允許 | | ?:internl_server_error | ?500 | ?サーバーエラー |
| | ?添加flash | ?redirect_to @sample, notice: '...' ? ?兩個基本一樣的 | ?notice | ?用于傳出通知 ?任意值 | | ?alert | ?用于穿出警告和錯誤(error) ? ?任意值 | redirect_to ({controller: :controller_test, action: :t8}), test_flash: 'just a test' | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
|
| ?redirect_back | ?重定向到前一個(Referer頭的前一個) ?redirect_back fallback_location: url ?fallback_location: url ?前一個不存在的時候重定向的目的地
| ?url | ?和url_for一樣的參數
| ?controller | ?視圖控制器名 | | ?action | ?動作(方法名)(controller#method) | | ?host | ?主機名(覆蓋現在的主機) | | ?protocol | ?協議名(覆蓋現在的協議) | | ?anchor | ?錨名? | | ?only_path? | ?是否返回相對url(是否省略協議/主機/接口) ?不指定host的話默認true | | ?trailing_slash | ?末尾要不要/ ?默認false | | ?user | ?HTTP識別用的用戶名 | | ?password | ?HTTP識別用的密碼 | | ?只指定一個:back | ?鏈接向之前一個鏈接? ?(返回Referer header) |
|
|
?send_file ?send_data | | ?發送文件 | ?send_file path [,opt] ? ?也就是下載鏈接 | | ?發送二進制文件? | ?send_data path [,opt]? ?表示圖片用 |
| ?參數 | ? | | ?opts | ? | ?filename | ?下載的文件名 ?默認: 原文件名 | | ?type | ?內容的種類 ?默認: application/octet-stream | | ?disposition | ?是inline表示(:inline) ?還是直接使用戶下載(:attachment) | | ?status? | ?狀態碼 ?默認200(ok) | | ?url_based_filename | ?是否根據下載的鏈接生成文件名 ?默認: false ?(filename指定了的話優先filename) | | ? | ? | | ? | ? | | ? | ? |
| | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
|
?(補充) 輸出日志 logger | ?p350 | ?logger.unknow(msg) | ?未知錯誤? | | ?loggger.fatal(msg) | ?致命錯誤 | | ?logger.error(msg) | ?錯誤 | | ?logger.warn(msg) | ?警告? | | ?logger.info(msg) | ?信息 | | ?logger.debug(msg) | ?bug信息 | | ? | ? | | ?優先度 | ?從上到下遞減 | | ? | ? | | ? | ?? |
|
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ?HTML以外的回應處理 |
| ?概要 | ?將處理結果以XML/JSON形式輸出 ?用途: 普通的回應是給人看的,而這種回應是用來把數據輸出給其他app |
| ?生成xml/json | ? | ?xml | ?render xml: :sample | | ?json | ?render json: :sample | 注: 一次可以指定多個不同的model,不用完全一樣 |
| ?JBuild生成JSON | ? | ?文件后綴 | ?.json.jbuilder | | ?構成 | ?Ruby腳本 | | ?生成json | ?json.array!(coll, partial: template, as: var)
| ?參數 | ? | ?coll | ?對象數組 | | ?partial: template | ?描繪每個元素所用的部分模塊 ?注意: 部分模塊命名開頭_ | | ?as: var | ?部分模塊里獲取每個元素的變量 | | ? | ? | | ? | ? |
| | ? | ? |
?例:?json.array! @books, partial: 'books/book', as: :book ? 其他寫法:?https://www.rubydoc.info/github/rails/jbuilder/Jbuilder:array! | | ?部分模板內的方法 | 輸出鍵與值 一個? | ?json.key value
注意: 鍵和值之間沒有空格
| ?參數 | ? | ?可以嵌套 ?接閉包 | ?json.key do ? ?json.subkey2 val1 ? ?json.subkey2 val2 ?end? | | ? | ?? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | 例: json.url book_url(book, format: :json) book_url: 由resources自動生成 | ?輸出鍵與值 ?多個 | ?json.extract! obj, prop, ...
| ?參數 | | ?obj | ?模型對象 | | ?prop | ?模型的屬性 生成的相當于 | | ? | ? | | ? | ? | | ? | ? | ? | | ?備注 | ?json.pro-name Model.pro-name ?也就是說鍵名和模型的屬性名相同 | | ?省略型 | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
例:?json.extract! sample, :pro1, :pro2, ... | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
|
| ?Build生成XML | ?要在Gemfile最后一句 ?gem 'activemodel-serializers-xml' ?然后運行bundle install
| ?文件后綴 | ?.xml.builder | | ?構成 | ?Ruby腳本 | | ?生成xml | ?xml.element([contet] [,attr: value, ...) do ? ? ...content... ?end | ?參數 | | ?element | ?要素名 | | ?attr | ?屬性名 | | ?value | ?屬性值 | | ?content | ?代碼塊的內容 | | ? | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
| | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
|
| ? | ?? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ?根據格式要求輸出 | ?respond_to_do |format| ? ? format.type { statements } ? ? ... ?end
| ?參數 | ? | ?format | ?格式控制對象 | | ?type | ?回應的格式 | | ?statements | ?描繪的代碼 | | ? | ? | | ? | ? |
| | ?注 | ?也可以帶條件 ?if ... ? ? format.type {statements} ? ? ... ?end? | | ?可用的形式 | ?html, xml, json, rss, atom, yaml, text, js, css, csv, ics | | ?追加形式 | ?http/mime_types.rb 格式 Mime::Type.register "text/richtext", :rtf | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
|
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ?狀態管理 |
| ?Rails可用的狀態管理方法 | ? | ?cookie | ?保存在瀏覽器的信息 (Rails以外也可用) | | ?session | ?保存在cookie, cash, database的做法 ?(最常用) | | ?flash | ?只對現在和下一個HTTP要求有效的特殊session |
|
| ?Cookie |
| ?設置Cookie值? | ? cookies[:name] = {key: value, ...}
| ?參數 | ? | ?name | ?cookie名 | | ?key | ?option | | ?value? | ?選項值 | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
| | ?option | ? ?value: ?必須 | ?cookie的值 ?例: ?sample@wings.msn.to | ?expires: ?必須 | ?cookie的有效期限 ?例: 3.hours.from_now ?不指定的話,關了瀏覽器就沒了 | | ?domain: | ?cookie有效的域名 | | ?path: | ?cookie有效的路徑 | | ?secure: | ?是否安全化 ?注: 如果選true, 則只在https下才會 發送cookies | | ?httponly: | ?是否只對HTTP有效 ?防止JavaScript來盜取 | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
| | ?永久性cookie | ?cookies.permanent[:key] = {...}? 注意: 有效期為20年, 優先級最高, 設定了expire也無視 | | ?加密cookies | ?cookies.encrypted[:key] = {...} yaoyushe/app/config/secrets.yml | | ?既加密又永久化 | ?cookies.permanent.encrypted[:key] = {...} | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
|
| ?刪除cookie | ?cookies.delete(:key) 對于設置了domain/path的,需要明確指定domain/path ?cookies.delete(:key, path: '...') |
| ?讀取 | ?cookies[:key] |
| ? | ? |
| ? | ? |
| ?Session |
| 概要? | ?默認情況下使用cookie來保存(CookieStore) ?和Cookie基本上一樣 ?不同點: 可以自由改變保存處
| ?CookieStore | ?默認保存方法 ?優點: 快的一筆2333 ?缺點: 不安全,不保存重要的 ? ? ? ? ? 單個上限4kb | | ?CacheStore | ?保存在服務器cache(應用的cache處) ?保存不怎么重要的短期數據 | | ?ActiveRecordStore | ?保存在服務器數據庫 ?適合保存核心數據 |
|
| ?設定session值 | ?session[:key] = value ?session默認有效期限是關閉瀏覽器前 ?保存方法,期限等在/app/config/ |
| ?設定session本身 |
| ?位置 | ?/app/config/initializer/session_store.rb ?如果沒有則在該位置自己建一個 | | ?文件內容 | ?Rails.application.config.session_store :cookie_store, key: '_XX_session' | | ?第一個參數 | ?數據存儲的種類 | ?cookie | ?:cookie_store ?默認值 | | ?緩存 | ?:cache_store | | ?數據庫 | ?:active_record_store ?Rails4以后和本體分離,需要另外安裝 ?active record-session_store | | ?使session無效 | ?:disabled | | ? | ? |
| | ?可指定參數 | ? | ?key | ?存儲session使用的鍵名 ?默認_session_id(根據項目名來決定) | | ?domain | ?session鍵有效的域名 ?默認nil(現在的域名) | | ?path | session鍵有效的pass ?默認/ | | ?expire_after | ?session有效期限 ?nil(關閉瀏覽器為止) ?要永久就設定20.years ?● 也可以寫成expire_in ? | | ?secure | ?保密通信(HTTPS)下session才有效 ?默認false | | ?httponly | ?HTTP cookie是否有效 ?默認true | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
| | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
|
| ?讀取 | ?sample = session[:key] 注: 得到的是以字符串為標簽的哈希表 |
| ?刪除 | ?session[:key] = nil ? |
| ?全部刪除 | ?reset_session |
| ?Flash |
| ?概要 | ?只對當前和下一個請求有效 ?主要用于確認信息等情況,如填完提交了表格提示保存成功等等 |
| ?使用例 | ???redirect_to @sample, notice: '...' ? ?兩個基本一樣的 | ?notice | ?用于傳出通知 ?任意值 | | ?alert | ?用于穿出警告和錯誤(error) ? ?任意值 |
|
| ?設定值 | ?flash[:key] = value |
| ?獲取值 | ?flash[:key] |
| ?相關方法 | ? | ?flash.now[:key]? | ?只對當前方法有效的flash | | ?flash.keep(:key) | ?指定的key保存到下一個方法 | | ?flash:discard(:key) | ?刪除指定的key ?不指定的話全部刪除 | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
|
| ?? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
?篩選(filter) 預處理與后處理 |
| ?前或后執行 | ?before_action :method [, ...] ?after_action :method [, ...] ?使用的方法用private藏起來 ?可以用多個方法,直接往后加 ?用render/redirect_to或者發出異常來中止before_action | ?選項 | ? | | ?只對一部分方法生效 | ?only: [:t1, :t2, ...] | | ?except | ?except: [t1, t2, ...] | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
|
| ?前后執行 | ?around_action :method [, ...]? ?使用的方法用private藏起來 注: 用yield來表明action的執行時刻
例 ?around_action :test
?private ? ? def test ? ? ? ?...before... ? ? ? ?yield ? ? ? ?...after... ? ? end |
| ?敲過部分篩選處理 | ?母類---子類---孫類 ? | ?去除繼承子母類的 | ?skip_before_action :action-name ?skip_around_action :action-name ?skip_after_action :action-name | | ?注 | ?也可以用only,except | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? | | ? | ? |
|
| ?Rails自帶認證的問題 | ?①.只能用自帶的認證對話框 ?②.沒辦法logout,瀏覽器關閉前一直是登陸狀態 |
?用戶認證 ?Rails自帶的簡單認證 | ? authenticate_or_request_with_http_basic(realm) do |name, passwd|login_procedureend 返回true/false
| ?參數 | ? | ?realm | ?realm名 ?默認"Application" | | ?name | ?用戶名? | | ?passwd | ?密碼? | | ?login_procedure | ?登陸處理 | | ? | ? |
| | ? | ? | | ? | ? |
? ? |
?用戶認證 ?Rails自帶的更安全認證 | ?? authenticate_or_request_with_http_digest(realm) do |name|...
end ?返回密碼,如果符合就成功,不符合就失敗 例:? before_action :auth_
REALM = 'SAMPLE'
USER = { name: 'name', password: '1234'}
def auth_
authenticate_or_request_with_http_digest(REALM) do |n|USER[:password]
end ? |
| ?實現認證密碼 |
| ?安裝bcrypt庫 | ? | ?在Gemfile最后添加 | ?gem 'bcrypt', '~>3.1.7' | | ?執行: | ?bundle install | | ?重啟動服務器 | ? | | ? | ? | | ? | ? |
|
| ?使用brcypt庫 | ? | ?建立用戶的模型rails generate model users user_name:string password:string | ?在模型里添加 ?has_secure_password ?不要confirmation驗證的話 has_secure_password validation:false 注:這個方法(method)自動添加了 | ?password/password_confirmation屬性 | ?假想屬性,不是一定要的 | | ?password屬性的必須的認證,字符串長度驗證(72以內) | ? | | ?password/password_confirmation屬性的confirmation認證 | 不要的話 ?? | | ?認證方法 authenticate | ? |
| ?在模型里添加列(string) ?password_digest? 注意: 此列作為密碼 登錄密碼時候用BCrypt::Password.create(@password) | | ? @user = Login.new(:user => @username, :password_digest => BCrypt::Password.create(@password))? | | ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ?定義共有的動作(application controller) |
| ?位置 | ?/app/controller/application_controller.rb |
| ?作用 | ?所以視圖控制器的母類 ?用于定義 ?子類需要的幫助類方法(helper method) ?大部分視圖控制器使用的篩選功能(filter) ?應用全體的設定 |
| ?異常處理 | ?不應該在每一個具體的視圖控制器里,應該在母類里 ?rescue_from except, with: rescuer
? | ?參數 | ? | ?except | ?異常 | | ?with: rescuer | ?處理該異常的方法(method) | | ? | ? | | ? | ? | | ? | ? |
| | ? | ? | | ? | ? | | ? | ? | | ?注 | ?實際產品環境(production)下產生異常會自動呼出異常相對應的頁面 ?位置: /public/ ?如404.html |
|
?防范 跨站請求偽造(CSRF) ?Cross-site request fogery | ?protect_from_fogery with: :...
| ?with: :... | ?遇到偽造請求的處理方法
| ?:exception | ?生成異常 ?ActionController: invalidAuthenticityToken | | ?:reset_session | ?刪除session | | ?:set_session | ?換成空的session ?默認值 |
| | ? | ? | | ? | ? | | ? | ? | | ? | ? |
|
| ?按設備分配頁面 | ?設備信息?request.headers['User-Agent']
| ?request.variant = :mobile | ?呼出后綴為 ?html+mobile.erb ?網址...t1?type=mobile | | ?request.variant = :tablet | ?呼出后綴為 ?html+tablet.erb ?網址...t1?type=tablet | | ?沒設定request.variant? | ?呼出后綴為 ?html.erb ?也就是默認 |
|
| ?增加flash變量 | ?add_flash_type(type, ...) ?redirect_to里面有兩個,notice, alert ?增加除此之外的用 ?add_flash_type(:test1, :test2, ...)
| ?type | ?鍵(符號symbol) | | ?使用 | ?redirect_to url, test: 'test' | | ? | ? | | ? | ? | | ? | ? |
|
| ?多個視圖控制器/模型共有的邏輯 |
| ?放置位置 | ?/app/controllers/concerns/ ?/app/models/concerns |
?寫法 ?p399 | ? module nameextend ActiveSupport::Concern # 只含有實例方法的話可以省略extend ActiveSupport::Concern
included do#call_clazz # 呼出包含此模塊的類的類方法
endmodule ClassMethods#clazz # 類方法的定義
end#instance # 實例方法
end ? | ?call_clazz | ?呼出方法 ?呼出包含此模塊的類的類方法 | | ?module ClasssMethod | ?類方法的定義 | | ?instance | ?實例方法 | | ?extend ActiveSupport::Concern | ?共通的內容 ?只含有實例方法的話可以省略 ?include的成為實例方法 ?extend的成為靜態方法 | | ? | ? | 例子
? ? module Login ? ? ? extend ActiveSupport::Concern ? ? ? included do ? ? ? ? before_action :login ? ? end ? ? ? private ? ? ? ? def login ? ? ? ? ? ? #render plain: 'login module test successfully' ? ? ? ? end end ? ?? |
| ?使用 | ?include Module-Name |
| ?文件命名規則 | ?字母要一直,單詞之間_間隔,module名的單詞首字母大寫 ?如 test.rb ---> module Test ? ? ?ni_hao.rb ---> module NiHao |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |
| ? | ? |