Rails HTTP流程

ApplicationController

class ApplicationController < ActionController::Base
  protect_from_forgery  with: :exception#开启CSRF
  # with: :null_session 关闭CSRF
end

当我们需要开放API给非浏览器客户端时,需要关闭CSRF

class ApisController < ApplicationController
  skip_before_action :verify_authenticity_token # 整个ApisController 关闭检查
end

render指定Template

render :template => 'index'  #或者省略成
render 'index'
#还可以指定不同的controller的action
render 'events/index'

Redirect

redirect_to :back #返回上一页

传送二进制数据

send_data( data, options={} ) #传送二进制数据
  • data 二进制数据
  • :filename下载后保存的文件名
  • :type默认是application/octet-stream
  • :disposition为inline或attachment
  • :stauts默认是200
send_file( file_location, options={} )
  • file_location是文件在服务器的路径
  • :file_name下载下来的文件名
  • :type默认是application/octet-stream
  • :disposition inline或attachment
  • :status默认是200

Session使用

session[:cart_id] = @cart.id

session还可以用其他的方式来存储,可以修改config/initializers/session_store.rb:

  • :active_record_store 使用数据库来存储
  • :mem_cache_store 使用memcached存储

如果采用:active_record_store的话,必须安装activerecord-session_store这个gem包。然后产生sessions数据表

$ rails g active_record:session_migration
$ rake db:migrate

Cookies使用

#设置过期时间
cookies[:login] = { :value => "XJ-122", :expires => 1.hour.from_now }
#
cookies.delete :login

因为资料是放在用户浏览器的,不希望用户更改

cookies.signed[:user_preferences] = @current_user.preferences

也可以让cookie永远留在浏览器中

cookies.permanent[:remember_me] = [current_user.id, current_user.salt]

两者可以同时使用

cookies.permanent.signed[:remember_me] = [current_user.id, current_user.salt]

Flash发送信息

Flash会将资料保存到下一个request中去

flash[:notice] = 'success'

Filters

常用的有before_action、after_action、around_action。
均可以搭配:only或者:except.
如果需要取消从父类中继承过来的filter,可以使用skip_before_action同理还有skip_after_action和skip_aroun_action。

rescue_from

可以让controller在特定的状况下执行特定的操作。

class ApplicationController < ActionController::Base

    rescue_from ActiveRecord::RecordInvalid, :with => :show_error

    protected

    def show_error
        # render something
    end

end

对于没有拦截到的操作,rails会渲染500页面。比较常见使用rescue_from的是使用第三方库,该库可能丢出一些事件,如果你要做额外的错误处理。比如在使用pundit检查权限这个第三方库,如果发生权限不够的时候就会抛出Pundit::NotAuthorizedError异常。

rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized

protected

def user_not_authorized
 flash[:alert] = I18n.t(:user_not_authorized)
 redirect_to(request.referrer || root_path)
end

检测用户访问设备

class ApplicationController < ActionController::Base

before_action :detect_browser

private
   
def detect_browser
  case request.user_agent
    when /iPad/i
      request.variant = :tablet
    when /iPhone/i
      request.variant = :phone
    when /Android/i && /mobile/i
      request.variant = :phone
    when /Android/i
      request.variant = :tablet
    when /Windows Phone/i
      request.variant = :phone
    else
      request.variant = :desktop
   end
end

可以在action中这样使用

def index
  # ...
  respond_to do |format|
    format.html
    format.html.phone
    format.html.tablet
  end
end

Template的命名规则是index.html+phone.erb和index.html+teblet.erb

你可能感兴趣的:(Rails HTTP流程)