日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Rails5 Controller Document

發布時間:2025/7/14 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Rails5 Controller Document 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
更新: 2017/06/28 大致完成全部 更新: 2017/06/29 補充module文件命名規則 更新: 2017/07/09 補充session的設置 更新: 2018/03/06 修正render(1)處的用詞 [模板] ---> [模板(templata)] 更新: 2018/03/15 完善session處的表述 完善concern處的說明,? 代碼放進代碼塊 更新: 2018/03/18 補充session的選項expire_after也可以是expire_in 更新: 2018/07/09 補充json.array!的其他寫法 更新: 2018/09/30 補充render文件的命名規則及部分模板(partial template)的呼出 更新: 2019/05/17 對filter進行修改與補充, 改進用戶認證digest例子
?請求(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]?
?表示圖片用

?參數?
?path?讀取的文件路徑
?opts?選項
??
?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

注意: 鍵和值之間沒有空格
?參數
?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(現在的域名)
?pathsession鍵有效的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
??
??
??
??
??

?

轉載于:https://www.cnblogs.com/lancgg/p/8281786.html

總結

以上是生活随笔為你收集整理的Rails5 Controller Document的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。