32、Rails应用开发与部署的高级技巧

Rails应用开发与部署的高级技巧

1. Rails会话存储

Rails默认会为每个访问者(无论是否登录)创建一个新会话,且会话默认存储在用户浏览器的cookie中。然而,cookie并非存储会话数据的最佳选择,因为它存在大小限制(4KB)、安全性低,还会增加服务器请求和响应的负担。

当需要在会话(或闪存)中存储额外信息,或者创建更高级的功能(如用户在线统计或服务器端会话过期)时,基于cookie的会话就会变得棘手。因此,Rails支持其他会话存储容器,下面介绍ActiveRecord存储会话容器。

1.1 ActiveRecord存储会话容器

ActiveRecord存储会话容器是除默认基于cookie的存储方式外最受欢迎的选择之一,它将所有会话数据存储在数据库的表中。虽然它不如其他选项快,但允许从多台机器访问会话,这对于需要多台服务器的大型应用来说是一项重要功能,而且配置也很简单。

以下是配置使用ActiveRecord存储会话容器的具体步骤:
1. 添加gem :将 activerecord-session_store 添加到 Gemfile 中,并运行 bundle install

gem 'activerecord-session_store'
  1. 创建会话表迁移文件 :运行以下命令创建一个新的迁移文件,该文件包含创建会话表所需的Ruby代码。
$ rails generate active_record:session_migration
  1. 应用迁移 :使用 rails db:migrate 命令应用迁移,将会话表添加到数据库中。
$ rails db:migrate
  1. 配置Rails使用ActiveRecord存储 :打开 config/initializers/session_store.rb 文件,将 cookie_store 的值改为 active_record_store
# Change
Rails.application.config.session_store :cookie_store, key: '/readit/session
# to
Rails.application.config.session_store :active_record_store, key: '/readit/
  1. 重启应用 :使用 rails s 重启应用,会话将存储在SQL数据库中。
  2. 部署到Heroku :在本地提交更改并推送到Heroku,然后在Heroku数据库上运行迁移。
$ git add .
$ git commit -m "Use ActiveRecord Session Store"
$ git push heroku master
$ heroku run rails db:migrate

除了ActiveRecord存储会话容器,还有其他会话存储选项,如缓存存储,以及社区开发的许多其他选项。

2. 其他Rails特性和扩展

2.1 缓存

根据项目预算和硬件可用性,每个Rails应用在任何给定时间只能处理一定数量的动态页面。如果应用的流量超过这些限制,就需要考虑添加缓存。缓存是一种存储先前生成且未更改的内容的方法,以便能够快速再次提供服务。

Rails内置的缓存选项具有不同的粒度级别:
- 页面缓存 :最简单的方式是将整个页面以HTML文件的形式缓存。Rails会将会发送到浏览器的输出存储在服务器硬盘上的文件中,只要配置适当,Web服务器可以直接提供该文件,而无需麻烦Puma,从而避免Rails反复生成相同的页面内容。
- 动作和视图片段缓存 :还可以缓存单个动作的输出,甚至视图的片段(如侧边栏)。

使用缓存可以显著提高应用的性能,但需要注意在页面内容更改时刷新相关的缓存部分,否则用户将收到过时的内容。此外,如果应用依赖大量用户特定的内容,使用缓存页面可能不可行。

2.2 ActionCable

Rails 5的一个令人兴奋的变化是添加了ActionCable,它将WebSockets引入到Rails应用中。WebSockets在浏览器和服务器之间打开了一个双向通信通道。传统上,Web应用中客户端和服务器的交互方式是浏览器向服务器发送数据或请求数据。随着AJAX的出现,浏览器可以向服务器建立单向异步通道,但轮询服务器端更改成本高、容易出错且占用资源。

WebSockets解决了这个问题,它允许服务器在事件发生时直接向浏览器发送事件,而无需浏览器轮询。这为实时应用开辟了新的领域,例如聊天应用,浏览器客户端订阅基于WebSocket的通道,服务器在有新聊天数据时将其发送到通道上。

当你准备探索WebSockets和ActionCable时,可以查看以下两篇文章:
- ActionCable and WebSockets
- Creating a Chat Application in Rails 5

2.3 Rails API

当前Web应用开发的另一个趋势是应用程序编程接口(API)的普及。API是一种向其他应用程序(而非用户)公开其数据和功能的应用,它是构建更大应用的基础模块。如今,几乎所有互联网服务都公开了API,如Twitter、Facebook、Google Maps等。

在Rails 5之前,使用Rails构建API需要包含一些外部gem,移除所有视图库,并进行一些自定义配置。现在,Rails核心团队使创建基于Rails的API应用变得更加容易。创建API应用只需运行以下命令:

$ rails new readit-api --api

2.4 异常通知

Rails在应用出现错误时不会向用户显示冗长的堆栈跟踪,而是显示一条礼貌的消息,告知请求无法成功处理。默认的错误消息模板可以在 public/404.html public/500.html 中找到。

如果想修复这些错误而不是忽略它们,可以安装 exception_notification gem,它会在应用出现异常活动时发送电子邮件通知。安装步骤如下:
1. 将 exception_notification 添加到 Gemfile 中。

gem 'exception_notification'
  1. 运行 bundle install 安装gem。

2.5 性能优化

作为开发者,不可避免地需要对应用进行性能优化。性能优化通常集中在应用的各个细节上,如优化SQL查询、使用缓存或修改Javascript代码。

以一个常见的性能问题“N+1查询”为例,在Story show视图中调用 <%= story.user.name %> 时,由于 story.user 需要访问第二个表(用户表),会导致额外的SQL查询。理想情况下,应该在第一次查询数据库时就包含Story的用户信息,这样可以节省每个故事的一次往返查询,当应用规模很大时,这可能会带来显著的性能提升。

在进行性能优化时,有两条经验法则:
1. 不要过早优化 :除非确定优化会产生效果,否则不要进行优化。
2. 只优化可测量的部分 :如果无法对优化前后进行测量,那么很可能是在浪费时间。

2.6 额外挑战

可以使用Google搜索如何消除故事显示视图中的N+1查询。

综上所述,通过合理选择会话存储容器、使用缓存、利用ActionCable和Rails API等特性,以及进行性能优化,可以提升Rails应用的性能和功能。希望这些技巧能帮助你在Rails应用开发和部署中取得更好的成果。

3. 总结与操作步骤回顾

3.1 会话存储配置步骤总结

为了更清晰地展示Rails会话存储从默认的cookie存储切换到ActiveRecord存储的过程,下面以表格形式呈现操作步骤:
| 步骤 | 操作内容 | 代码示例 |
| — | — | — |
| 1 | 添加gem到 Gemfile | gem 'activerecord-session_store' ,然后运行 bundle install |
| 2 | 生成会话表迁移文件 | rails generate active_record:session_migration |
| 3 | 应用迁移 | rails db:migrate |
| 4 | 配置Rails使用ActiveRecord存储 | 修改 config/initializers/session_store.rb 文件,将 cookie_store 改为 active_record_store
ruby<br># Change<br>Rails.application.config.session_store :cookie_store, key: '/readit/session<br># to<br>Rails.application.config.session_store :active_record_store, key: '/readit/<br> |
| 5 | 重启应用 | rails s |
| 6 | 部署到Heroku | 依次执行以下命令:
bash<br>$ git add.<br>$ git commit -m "Use ActiveRecord Session Store"<br>$ git push heroku master<br>$ heroku run rails db:migrate<br> |

3.2 性能优化操作要点

性能优化对于Rails应用的稳定运行至关重要,下面以流程图的形式展示性能优化的基本流程:

graph LR
    A[发现性能问题] --> B{是否可测量}
    B -- 是 --> C{是否确定有效果}
    C -- 是 --> D[进行优化]
    C -- 否 --> E[不进行优化]
    B -- 否 --> E[不进行优化]
    D --> F[测量优化后效果]
    F --> G{效果是否显著}
    G -- 是 --> H[优化完成]
    G -- 否 --> I[重新评估优化方案]
    I --> D

3.3 异常通知配置步骤

异常通知可以帮助开发者及时发现应用中的问题,其配置步骤如下:
1. 添加gem到 Gemfile

gem 'exception_notification'
  1. 安装gem
    运行 bundle install 命令来安装 exception_notification gem。

3.4 其他特性使用要点

除了上述内容,Rails的其他特性如缓存、ActionCable和Rails API也有各自的使用要点:
- 缓存
- 页面缓存:将整个页面以HTML文件形式存储在服务器硬盘,配置好后Web服务器可直接提供服务。
- 动作和视图片段缓存:可缓存单个动作输出或视图片段,但要注意页面内容更改时刷新缓存。
- ActionCable :引入WebSockets实现服务器与客户端的双向通信,适用于实时应用,如聊天应用。可参考相关文章进一步学习。
- Rails API :创建API应用只需运行 rails new readit-api --api 命令。

4. 总结与展望

通过上述介绍,我们了解了Rails应用开发和部署中的多个重要方面,包括会话存储、缓存、ActionCable、Rails API、异常通知和性能优化等。合理运用这些技术和方法,可以显著提升Rails应用的性能、功能和稳定性。

在实际开发中,我们可以根据应用的具体需求和场景,选择合适的会话存储方式,利用缓存提高响应速度,借助ActionCable实现实时交互,通过Rails API构建可扩展的应用架构,使用异常通知及时发现和解决问题,并通过性能优化确保应用在高负载下的稳定运行。

希望这些知识和技巧能为你的Rails应用开发和部署提供有力的支持,让你能够构建出更加优秀的Web应用。同时,不断探索和实践,结合实际项目需求,灵活运用这些技术,相信你会在Rails开发领域取得更好的成果。

最后,别忘了尝试解决故事显示视图中的N+1查询问题,这将进一步提升你的开发能力和应用性能。祝你在Rails开发的道路上一帆风顺!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值