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