铁轨,我选择了你!!~5
Rails,我选择了你吧!!~目录
会话管理
“会议是什么来着?” shì ?)
通过无状态的HTTP + 会话,Cookie = 实现有状态的通信,以便保存状态的机制,实现登录功能和购物车等。
会话:服务器端管理
Cookie:由客户端(浏览器)管理
商店(存储会话的地方)的类型
CookieStore
CacheStore
ActiveRecoreStore
DalliStore
RedisStore
虽然有很多选择,但这次我们选择使用Redis
安装Redis
brew install redis
redis-server
在另一个终端窗口中,Redis服务器已成功启动。
redis-cli
启动Redis客户端并访问Redis服务器。
尝试玩一玩
$ redis-cli
127.0.0.1:6379> set foo "honya"
OK
127.0.0.1:6379> get foo
"honya"
127.0.0.1:6379> keys *
1) "foo"
设定键值对:存储值
获取键值对:取得值
将 Redis 用作 Rails 的会话存储。
必须引入专用的宝石。
据说redis-rails和redis-session-store很有名。
只需一个选项,将以下内容用中文进行归纳:
这次是在Gemfile中
gem 'redis-rails'
添加并执行bundle install命令。
设置会话的方法是创建一个config/initializers/session_store.rb文件,并按照如下方式进行设置
Rails.application.config.session_store :redis_store, {
servers: [
{
host: ENV['REDIS_HOST'] || 'localhost',
port: ENV['REDIS_PORT'] || 6379,
db: 0,
namespace: 'session'
}
],
expire_after: 90.minutes
}
因为这本书中有错字(写着一个神秘的“end”),所以请注意。
由于在本地环境和生产环境中使用不同的Redis服务器,因此需要根据不同的环境切换Redis的连接目标。
以环境变量的形式参考ENV[‘REDIS_HOST’]。
export REDIS_PORT=9999
只需要一个选项:
在启动Rails Server之前,在终端中执行导出命令,如上所述,即可设置环境变量。
对我来说有点困难。
在Rails中如何使用会话
可以从控制器或视图中作为session方法使用。session对象与哈希相同。
不明白哈希是什么,就去谷歌搜索。类似于Python的字典。
# sessionの読み取り
current_user_id = session[:user_id]
# sessionの書き込み
session[:user_id] = current_user.id
# sessionの一部を削除
session[:user_id] = nil
# session全体を破棄
reset_session
通过“rescue_from”来处理错误
状态码的回顾
在Rails中,根据发生的异常自动返回相应的HTTP状态码。如果是静态错误页面,则可以将其放置在public/xxx.html(如public/404.html)并返回。
当想要进行除了默认异常处理之外的其他处理时,可以使用`rescue_from`。
-
- 実際にエラー画面をみたいとき
- config/environments/development.rbに以下の変更を加える。
# Show full error reports
config.consider_all_requests_local = false # デフォルトはtrue
根据默认设置,似乎会输出用于调试的错误详细信息,而不是显示错误页面。嗯,看起来无关紧要。
4xx系列的处理方式
-
- 例外とHTTPシンボルの対応がみたいとき
- コンソールからActionDispatch::ExceptionWrapper.rescue_responsesを呼び出すことで確認できる
$ bin/rails c
Loading development environment (Rails 5.1.5)
[1] pry(main)> ActionDispatch::ExceptionWrapper.rescue_responses
=> {"ActionController::RoutingError"=>:not_found,
"AbstractController::ActionNotFound"=>:not_found,
"ActionController::MethodNotAllowed"=>:method_not_allowed,
"ActionController::UnknownHttpMethod"=>:method_not_allowed,
"ActionController::NotImplemented"=>:not_implemented,
"ActionController::UnknownFormat"=>:not_acceptable,
"ActionController::InvalidAuthenticityToken"=>:unprocessable_entity,
"ActionController::InvalidCrossOriginRequest"=>:unprocessable_entity,
"ActionDispatch::Http::Parameters::ParseError"=>:bad_request,
"ActionController::BadRequest"=>:bad_request,
"ActionController::ParameterMissing"=>:bad_request,
"Rack::QueryParser::ParameterTypeError"=>:bad_request,
"Rack::QueryParser::InvalidParameterError"=>:bad_request,
"ActiveRecord::RecordNotFound"=>:not_found,
"ActiveRecord::StaleObjectError"=>:conflict,
"ActiveRecord::RecordInvalid"=>:unprocessable_entity,
"ActiveRecord::RecordNotSaved"=>:unprocessable_entity}
- シンボルをステータスコードに変換
可以使用Rack::Utils.status_code方法将符号转换为状态码。
[4] pry(main)> Rack::Utils.status_code(:not_found)
=> 404
[5] pry(main)> Rack::Utils.status_code(:conflict)
=> 409
只有4系列才能查看例外符号和状态码的对应关系吗?尝试了几个,全部都是4系列,很奇怪…
-
- デフォルト以外の処理をしたい/動的なエラーページを表示したい
-
- ApplicationControllerにrescue_fromを宣言する
- app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
rescue_from ActiveRecord::RecordNotFound, with: :not_found
def not_found
render 'errors/404', status: 404
end
end
如果在Rails应用程序的某个地方发生了ActiveRecord::RecordNotFound错误,执行使用with选项指定的函数处理。返回自定义页面errors/404,取代默认的处理方式返回public/404.html。
一点点懂了哈哈
可以定义自定义异常。如果要定义自定义异常,应继承StandardError,而不是Exception。
独自例外是什么呢?不太清楚。刚才在application_controller中定义了一个自定义处理默认存在的例外。这次是要实现自定义的例外?有点难以理解。先去搜索下吧。
异常
|
|- 标准错误
| |- 类型错误和运行时错误等由应用程序引起的异常
| |- 我们为应用程序自定义的异常
|
|- 其他异常:如内存错误等由系统引起的异常。应用程序无法解决的类型
啊,我大概明白了。就像HTTP错误一样,除了大家都能理解的错误,还有别的类型的错误吧。
class CustomError < StandardError; end
就是这样继承的。
对5xx系列的处理
当发生不属于4系列的意外异常时,可能包括语法错误、对nil的处理失误以及实现错误,还有由库(gem)引起的错误等。
服务器错误。当使用Rails创建Web应用时,用户的操作问题归类于4系,应用程序本身的问题归类于5系,这样理解可以吗?
在这种情况下,我刚才在考虑是否可以使用`rescue_from StandardError`或`rescue_from Exception`来定义自定义异常,但似乎是不被推荐的。
如果发生了5xx系列错误,不能保证能够继续处理,并且由于没有动态输出页面的需要,
因为处理会停止,所以即使创建了自定义异常也无法执行嘛,哈哈哈。
那我们要怎么办呢?
将5xx系列的处理在事前把合适的静态文件放置在public/500.html中。如果出现意外的异常情况,Rails会自动返回public/500.html。
即使处理停止,Rails也会用最后一丝力气返回public/500.html给我。太棒了。
这次学习了会话管理和错误处理。由于这是一个需要实际操作才能真正理解的主题,所以我只能模糊地理解它,但至少抓到了氛围吧~
下次打算深入一点了解路由器,并写一些关于Web安全的防护措施。