多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > [Ruby On Rails] Action Controller - 控制HTTP 流程

[Ruby On Rails] Action Controller - 控制HTTP 流程

來源:程序員人生   發(fā)布時(shí)間:2016-06-17 08:12:07 閱讀次數(shù):2682次

Controlling complexity is the essence of computer programming. — Brian Kernighan

HTTP通訊協(xié)議是1種Request-Response (要求-回應(yīng))的流程,客戶端(通常是閱讀器)向伺服器送出1個(gè)HTTP request封包,然后伺服器就回應(yīng)1個(gè)response封包。在上1章中,我們介紹了Rails如何使用路由來分派requestController的其中1個(gè)Action。而每一個(gè)Action的任務(wù)就是根據(jù)客戶端傳來的資料與Model互動(dòng),然后回應(yīng)結(jié)果給客戶端。這1章中我們將仔細(xì)介紹負(fù)責(zé)回應(yīng)要求的Controller

ApplicationController

透過rails g controller指令產(chǎn)生出來的controller都會(huì)繼承自ApplicationController。因此定義在這里的方法可以被所有Controller取用,你可以在這邊定義1些共用的方法。預(yù)設(shè)的application_controller.rb長的以下:

class ApplicationController < ActionController::Base protect_from_forgery end

其中的protect_from_forgery方法啟動(dòng)了CSRF安全性功能,所有非GETHTTP request都必須帶有1個(gè)Token參數(shù)才能存取,Rails會(huì)自動(dòng)在所有表單中幫你插入Token參數(shù),預(yù)設(shè)的Layout中也有1行<% = csrf_meta_tag %>標(biāo)簽可讓JavaScript讀取到這個(gè)Token

但是當(dāng)需要開放API給非閱讀器客戶端時(shí),例如手機(jī)端或第3方利用的回呼(webhook),這時(shí)候候我們會(huì)需要關(guān)閉這個(gè)功能,例如:

class ApisController < ApplicationController skip_before_action :verify_authenticity_token # 全部ApisController 關(guān)閉檢查 end

CSRF 網(wǎng)路攻擊http://en.wikipedia.org/wiki/Cross-site_request_forgery

注意,請(qǐng)將方法放在protectedprivate之下,如果是public方法,就會(huì)變成1個(gè)公然的Action可以給閱讀器呼喚到。

產(chǎn)生ControllerAction

我們?cè)?span style="margin:0px; padding:0px 3px; border:0px; font-size:1em; font-family:'andale mono','lucida console'; vertical-align:baseline; line-height:normal">Part1示范過,要產(chǎn)生1個(gè)Controller檔案,請(qǐng)輸入

rails g controller events

如此便會(huì)產(chǎn)生app/controllers/events_controller.rb,依照RESTful設(shè)計(jì)的慣例,所有的Controller命名都是復(fù)數(shù),而檔案名稱依照慣例都是{name}_controller.rb

1個(gè)Action就是Controller里的1個(gè)Public方法:

class EventsController < ApplicationController def show # ... end end

除 ??繼承自ApplicationController,我們也能夠繼承更底層的ActionController::Metal,請(qǐng)參考Rails3:新的Metal機(jī)制。

Action方法中我們要處理request,基本上會(huì)做3件事情: 1.搜集request的資訊,例如使用者傳進(jìn)來的參數(shù)2.操作Model來做資料的處理3.回傳response結(jié)果,這個(gè)動(dòng)作稱作render

Request資訊搜集

ControllerAction當(dāng)中,Rails提供了1些方法可讓你得知此request各種資訊,包括:

  • action_name目前的Action名稱
  • cookies Cookie下述
  • headers HTTP標(biāo)頭
  • params包括用戶所有傳進(jìn)來的參數(shù)Hash,這是最常使用的資訊
  • request各種關(guān)于此request的詳細(xì)資訊,較經(jīng)常使用的例如:
    • xml_http_request? 或xhr?,這個(gè)方法可以知道是否是Ajax 要求
    • host_with_port
    • remote_ip
    • headers
  • response代表要回傳的內(nèi)容,會(huì)由Rails設(shè)定好。通常你會(huì)用到的時(shí)機(jī)是你想加特別的Response Header
  • session Session下述

正確的說,params這個(gè)HashActiveSupport::HashWithIndifferentAccess物件,而不是普通的Hash而已。Ruby內(nèi)建的Hash,用Symbolhash[:foo]和用字串的hash["foo"]是不1樣的,這在混用的時(shí)候常常弄錯(cuò)而取不到值,算是常見的臭蟲來源。Rails在這里使用的ActiveSupport::HashWithIndifferentAccess物件,不管鍵是Symbol或字串,都指涉相同的值,減少麻煩。

Render結(jié)果

在根據(jù)request資訊做好資料處理以后,我們接下來就要回傳結(jié)果給用戶。事實(shí)上,就算你甚么都不處理,Action方法里面空空如也,乃至不定義ActionRails預(yù)設(shè)也還是會(huì)履行render方法。這個(gè)render方法會(huì)回傳預(yù)設(shè)的Template,依照Rails慣例就是app/views/{controller_name}/{action_name}。如果找不到樣板檔案的話,會(huì)出現(xiàn)Template is missing的毛病。

固然,有時(shí)候我們會(huì)需要自定render,或許是指定不同的Template,或許是不需要Template。這時(shí)候候有以下參數(shù)可使用:

直接回傳結(jié)果

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

指定Template

  • :template指定Template,例如render :template => "index"或可以省略成render "index",如果是不同ControllerTemplate再加上Controller名稱,例如render "events/index"
  • :action指定同1個(gè)Controller中另外一個(gè)ActionTemplate (注意到只是使用它的Template,而不會(huì)履行該Action內(nèi)的程式)

其他參數(shù)

  • :status設(shè)定HTTP status,預(yù)設(shè)是200,也就是正常。其他經(jīng)常使用代碼包括401權(quán)限不足、404找不到頁面、500伺服器毛病等。
  • :layout可以指定這個(gè)ActionLayout,設(shè)成false即關(guān)掉Layout

補(bǔ)充1提,在特定情況你想把render的結(jié)果存成1個(gè)字串,例如拿到局部樣板Partials成為1個(gè)字串,這時(shí)候候可以改使用render_to_string :partial => "foobar"

Redirect

如果Action不要render任何結(jié)果,而是要使用者轉(zhuǎn)向到別頁,可使用redirect_to

  • redirect_to events_url
  • redirect_to :back回到上1頁。

注意,1個(gè)Action中只能有1個(gè)render或1個(gè)redirect_to。不然你會(huì)得到1個(gè)DoubleRenderError例外毛病。

串流Sending data

如果需要回傳2進(jìn)位Binary資料,有兩個(gè)方法可使用:

send_data(data, options={})回傳2進(jìn)位字串,接受以下參數(shù):

  • 其中data參數(shù)是2進(jìn)位的字串:
  • :filename使用者貯存下來的檔案名稱
  • :type預(yù)設(shè)是application/octet-stream
  • :disposition inlineattachment
  • :status預(yù)設(shè)是200

send_file(file_location, options={})回傳1個(gè)檔案,接受以下參數(shù):

  • 其中file_location是檔案路徑和檔名:
  • :filename使用者貯存下來的檔案名稱
  • :type預(yù)設(shè)是application/octet-stream
  • :disposition inlineattachment
  • :status預(yù)設(shè)是200

不過實(shí)務(wù)上我們很少在上線環(huán)境上直接用Rails來推送靜態(tài)檔案,由于大檔的傳輸時(shí)間會(huì)浪費(fèi)寶貴的Rails運(yùn)算資源。我們會(huì)改用X-Sendfile Header將傳檔的任務(wù)委派給網(wǎng)頁伺服器(例如ApacheNginx )處理,來下降Rails伺服器的負(fù)擔(dān)。或是搭配第3方云貯存服務(wù)例如AWS S3將傳檔的任務(wù)外包出去。

respond_to

我們?cè)诘?章RESTful利用程式中曾示范過用法,respond_to可以用來回應(yīng)不同的資料格式。Rails內(nèi)建支援格式包括有:html, :text, :js, :css, :ics, :csv, :xml, :rss, :atom, :yaml, :json等。如果需要擴(kuò)充,可以編輯config/initializers/mime_types.rb這個(gè)檔案。

如果你想要設(shè)定1個(gè)else的情況,你可以用:any

respond_to do |format| format.html format.xml { render :xml => @event.to_xml } format.any { render :text => "WTF" } end

另外,Rails也支援單行的簡單寫法:

respond_to :html, :json, :js

這樣其實(shí)就是:

respond_to do |format| format.html format.json format.js end

Sessions

HTTP是1種無狀態(tài)的通訊協(xié)議,為了能夠讓閱讀器能夠在跨request之間記住資訊,Rails提供了Session功能,像是記住登入的狀態(tài)、記住使用者購物車的內(nèi)容等等,都是用Session實(shí)作出來的。

要操作Session,直接操作session這個(gè)Hash變數(shù)便可。例如:

session[:cart_id] = @cart.id

Session原理可以參考Session_ID,基本上也是利用閱讀器的cookie來追蹤requests要求。

Session storage

Rails預(yù)設(shè)采取Cookies session storage來貯存Session資料,它是將Session資料透過config/secrets.ymlsecret_key_base編碼后放到閱讀器的Cookie當(dāng)中,最大的好處是對(duì)伺服器的效能負(fù)擔(dān)很低,缺點(diǎn)是大小最多4Kb,和資料還是可以透過反編碼后看出來,只是沒法進(jìn)行修改。因此安全性較低,不合適寄存機(jī)密資料。

??Cookies session storageRails也支援其他方式,你可以修改config/initializers/session_store.rb

  • :active_record_store使用資料庫來貯存
  • :mem_cache_store使用Memcached快取系統(tǒng)來貯存,合適高流量的網(wǎng)站

1般來講使用預(yù)設(shè)的Cookies session storage便可,如果對(duì)安全性較高要求,可使用資料庫。如果希望統(tǒng)籌效能,可以斟酌使用Memcached

采取:active_record_store的話,必須安裝activerecord-session_store gem,然后產(chǎn)生sessions資料表:

$ rails g active_record:session_migration $ rake db:migrate

Cookies

??Session,我們也能夠直接操作底層的

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 久久精品伊人网 | 免费中文字幕视频 | 亚洲成a人片在线观看中文动漫 | 亚洲欧美综合色区小说 | 依人九九| 伊人久久精品亚洲午夜 | 波多野结衣免费线在线 | 最近中文字幕免费版在线3 最近中文字幕免费大全8高清 | 小说区 图片区 | 亚洲欧美激情精品一区二区 | 日本一区二区三区在线 视频观看免费 | 欧美日韩精品一区二区在线线 | 久久爱18 | avtt一区 | 国产在线观看中文字幕 | 免费片子 | 欧美三级大片在线观看 | 伊人影院在线视频 | 亚洲123区| 久久综合爱 | 免费看黄色的网址 | 网站在线观看免费视频 | 国产激情一区二区三区在线观看 | 国产国产成人人免费影院 | 91av成人| 久久久久久国产精品免费免费 | 亚洲天堂三区 | 久久婷五月天 | 欧美色就色 | 亚洲跨种族黑人xxx 亚洲老女人 | 日本a黄| 国产香蕉一区二区在线网站 | 最近的中文字幕在线国语 | 肉视频在线观看 | 中文字幕免费在线观看 | 欧美一区二区三区视视频 | 香蕉免费看一区二区三区 | 日本a中文字幕 | 免费国产高清精品一区在线 | 怡春院欧美一区二区三区免费 | 欧美两性人xxxx高清免费 |