<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>agilejzl (KD)</title>
    <link>https://ruby-china.org/agilejzl</link>
    <description> 爱好优美的编码艺术。</description>
    <language>en-us</language>
    <item>
      <title>有考虑使用 Sinatra + ActiveRecord 替换你的 Rails 项目吗</title>
      <description>&lt;p&gt;当你使用轻量级 Sinatra 做项目主框架，比如简单的 API 项目、MicroService，然后为了数据库模型操作引入的 Rails，你该怀疑了。&lt;/p&gt;

&lt;p&gt;打开你的 Gemfile.lock 文件，找到以下类似代码&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails (5.0.1)
      actioncable (= 5.0.1)
      actionmailer (= 5.0.1)
      actionpack (= 5.0.1)
      actionview (= 5.0.1)
      activejob (= 5.0.1)
      activemodel (= 5.0.1)
      activerecord (= 5.0.1)
      activesupport (= 5.0.1)
      bundler (&amp;gt;= 1.3.0, &amp;lt; 2.0)
      railties (= 5.0.1)
      sprockets-rails (&amp;gt;= 2.0.0)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其实只需引入 activerecord 就可以。&lt;/p&gt;

&lt;p&gt;最近在重温《Ruby 元编程》一书，有一章节讲到 attr_accessor 是怎么实现的。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User &amp;lt; ActiveRecord::Base
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你不觉得这是件神奇的事吗？为什么 Model 继承了 ActiveRecord::Base，就可以使用 attr_accessor、各种 ORM 操作。
当然 源代码能告诉你为什么。&lt;/p&gt;

&lt;p&gt;然后自己用 Sinatra 做控制器层，自己尝试写个简单版 gem &lt;a href="https://github.com/agilejzl/mini_active_record" rel="nofollow" target="_blank" title=""&gt;mini_active_record&lt;/a&gt;来实现，
项目的目录结构基本与 Rails 保持一致，如下
&lt;img src="https://l.ruby-china.com/photo/2018/70b1e2ab-020f-4e04-8e96-470bc6a67aee.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;一步一步实现下来，attr_accessor、validates、establish_connection、attribute_names、attributes 以及各种 CRUD 的操作，
有遇到实现问题时去看看官方 activerecord 的源代码，顿然明朗了。比如：&lt;/p&gt;

&lt;p&gt;validates 用&lt;code&gt;define_method "#{attribute}="&lt;/code&gt;  (PS：官方不是这么实现的啦~~)，那就跟 attr_accessor 有重复定义&lt;code&gt;attribute=&lt;/code&gt;方法了，
那么在 Model 里使用 attr_accessor、validates 有先后顺序依赖。&lt;/p&gt;

&lt;p&gt;establish_connection 的单例模式实现，以及如何加载数据库的配置参数？&lt;/p&gt;

&lt;p&gt;模型对象关系查询问题，如 &lt;code&gt;User.find_by(id: 1)&lt;/code&gt; 转换成对应 SQL，使用 gem arel 解决。 &lt;/p&gt;

&lt;p&gt;CRUD 的操作需要数据库适配、持久化，需要保持已修改的模型数据 和 上次与数据库同步的数据，这样  Model.persisted?、changed？等方法才能正常高效的运作。&lt;/p&gt;

&lt;p&gt;说了这么多，总结一句就是 Sinatra 项目 &lt;a href="https://github.com/agilejzl/mini_active_record" rel="nofollow" target="_blank" title=""&gt;mini_active_record&lt;/a&gt;，&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gem 'activerecord' # gem 'mini_active_record'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;加入这行代码，项目也能正常运作。&lt;/p&gt;</description>
      <author>agilejzl</author>
      <pubDate>Fri, 26 Jan 2018 10:40:49 +0800</pubDate>
      <link>https://ruby-china.org/topics/34951</link>
      <guid>https://ruby-china.org/topics/34951</guid>
    </item>
    <item>
      <title>分享个人 Rails 开源项目 博客眼上线啦</title>
      <description>&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;
一个多月的时间，白天上班 Coding，晚上 Coding，周末也 Coding，终于熬出了博客眼。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;项目简介&lt;/strong&gt;
博客眼，一个博客信息技术分享网站，网址 &lt;a href="http://www.blog-eye.com/" rel="nofollow" target="_blank"&gt;http://www.blog-eye.com/&lt;/a&gt; ，开源项目 &lt;a href="https://github.com/agilejzl/blog-eye" rel="nofollow" target="_blank"&gt;https://github.com/agilejzl/blog-eye&lt;/a&gt; 。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;主要功能&lt;/strong&gt;
主要有四大模板页，首页、博客主页、博客管理、系统后台。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;博客用户信息管理&lt;br&gt;
基于 Devise 的用户注册、登录、信息修改等，还可以对博客进行个性化定制。&lt;/li&gt;
&lt;li&gt;博客博文信息管理&lt;br&gt;
博主可以发布文章、收藏代码等，另外可以对评论进行隐藏。&lt;/li&gt;
&lt;li&gt;博客博文收藏展示&lt;br&gt;
将博主的文章、代码等展示，并展示一些博主定制的个人信息。&lt;/li&gt;
&lt;li&gt;网站后台管理&lt;br&gt;
这个省略几十个字，因为这个页面只有网站管理员才能看到。&lt;/li&gt;
&lt;li&gt;文章评论支持@&lt;br&gt;
在文章评论中可以@用户，然后被@的用户后收到站内消息提示。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;其它功能&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;用户默认头像&lt;br&gt;
用户注册时，后台从 gravatar.com 抓取邮箱对应的头像，并自动上传到七牛云存储。&lt;/li&gt;
&lt;li&gt;跨浏览器支持&lt;br&gt;
基于 Bootstrap3 支持，在 IE9 以上以及其它浏览器，有着一致的显示效果，IE8 以下提示用户升级浏览器。&lt;/li&gt;
&lt;li&gt;定时敏感词检测&lt;br&gt;
系统会定时抓取网站页面，然后根据敏感词库进行检测，如果含有自定义的敏感词，会自动提醒网站管理员。&lt;/li&gt;
&lt;li&gt;可扩展的架构支持&lt;br&gt;
可扩展的架构支持，前端使用 MVC 框架 Backbone.js，后端 RESTful 路由，不包含无用、冗余代码。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;部署相关&lt;/strong&gt;
使用 setup.rb 脚本，一步安装项目，capistrano 一键部署支持，项目配置信息统一在单个文件 settings.yml。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;特别感谢&lt;/strong&gt;
Github 代码托管、阿里云 ECS、七牛云存储。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;个人感言&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;再小的项目，要把每一处都做完善，也是很不容易。&lt;/li&gt;
&lt;li&gt;做项目的技术难点总会有解决方案，市场方面需要专业的推广、经营等。&lt;/li&gt;
&lt;li&gt;送给每个人，珍爱生命，远离加班。人生苦短，及时行乐！&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;最后&lt;/strong&gt;
麻雀虽小，五脏俱全。网站的主体架构已完成，后续会陆续更新。
欢迎大家来博客眼 &lt;a href="http://www.blog-eye.com/" rel="nofollow" target="_blank"&gt;http://www.blog-eye.com/&lt;/a&gt; 分享你们的博客，你们的支持将会是我最大的动力。&lt;/p&gt;</description>
      <author>agilejzl</author>
      <pubDate>Sun, 14 Sep 2014 13:30:02 +0800</pubDate>
      <link>https://ruby-china.org/topics/21524</link>
      <guid>https://ruby-china.org/topics/21524</guid>
    </item>
  </channel>
</rss>
