日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > [Ruby On Rails] Action Controller - 控制HTTP 流程

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

來源:程序員人生   發布時間:2016-06-17 08:12:07 閱讀次數:2689次

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

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

ApplicationController

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

class ApplicationController < ActionController::Base protect_from_forgery end

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

但是當需要開放API給非閱讀器客戶端時,例如手機端或第3方利用的回呼(webhook),這時候候我們會需要關閉這個功能,例如:

class ApisController < ApplicationController skip_before_action :verify_authenticity_token # 全部ApisController 關閉檢查 end

CSRF 網路攻擊http://en.wikipedia.org/wiki/Cross-site_request_forgery

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

產生ControllerAction

我們在Part1示范過,要產生1個Controller檔案,請輸入

rails g controller events

如此便會產生app/controllers/events_controller.rb,依照RESTful設計的慣例,所有的Controller命名都是復數,而檔案名稱依照慣例都是{name}_controller.rb

1個Action就是Controller里的1個Public方法:

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

除 ??繼承自ApplicationController,我們也能夠繼承更底層的ActionController::Metal,請參考Rails3:新的Metal機制。

Action方法中我們要處理request,基本上會做3件事情: 1.搜集request的資訊,例如使用者傳進來的參數2.操作Model來做資料的處理3.回傳response結果,這個動作稱作render

Request資訊搜集

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

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

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

Render結果

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

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

直接回傳結果

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

指定Template

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

其他參數

  • :status設定HTTP status,預設是200,也就是正常。其他經常使用代碼包括401權限不足、404找不到頁面、500伺服器毛病等。
  • :layout可以指定這個ActionLayout,設成false即關掉Layout

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

Redirect

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

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

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

串流Sending data

如果需要回傳2進位Binary資料,有兩個方法可使用:

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

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

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

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

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

respond_to

我們在第6章RESTful利用程式中曾示范過用法,respond_to可以用來回應不同的資料格式。Rails內建支援格式包括有:html, :text, :js, :css, :ics, :csv, :xml, :rss, :atom, :yaml, :json等。如果需要擴充,可以編輯config/initializers/mime_types.rb這個檔案。

如果你想要設定1個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

這樣其實就是:

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

Sessions

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

要操作Session,直接操作session這個Hash變數便可。例如:

session[:cart_id] = @cart.id

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

Session storage

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

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

  • :active_record_store使用資料庫來貯存
  • :mem_cache_store使用Memcached快取系統來貯存,合適高流量的網站

1般來講使用預設的Cookies session storage便可,如果對安全性較高要求,可使用資料庫。如果希望統籌效能,可以斟酌使用Memcached

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

$ rails g active_record:session_migration $ rake db:migrate

Cookies

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

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 日韩av在线一区二区三区 | 免费看黄色网 | 毛片免费观看 | 激情视频网址 | 日韩免费一二三区 | a级片在线免费观看 | 亚洲视频欧美视频 | 国产精品美女一区二区三区 | 久久久免费精品视频 | 一本色道久久综合亚洲二区三区 | 精品一区二区三区国产 | 国产精品久久久久久久久久久免费看 | 国产视频一区二区在线观看 | 97在线视频观看 | 欧美日韩中文字幕在线视频 | 中文字幕综合在线 | av色资源| 天天av天天好逼 | 亚洲天堂免费观看 | 欧美日韩在线一区二区 | 成人黄色电影在线观看 | 日本亚洲最大的色成网站www | 中文字幕免费视频 | 久久熟 | 不卡免费视频 | 精品国产乱码久久久久久丨区2区 | 亚洲乱码国产乱码精品精98午夜 | 久久综合成人精品亚洲另类欧美 | 黄色网址进入 | 成人欧美一区二区三区黑人孕妇 | 久久久精品播放 | 色婷婷六月 | 一区二区三区视频在线 | 日韩激情视频 | 久久久久久久久久久久久9999 | 久久久精品一区二区三区 | 日韩av免费在线 | 中文字幕二区 | 日韩一区二区三区视频 | 欧美成人激情视频 | 九九九国产 |