举例理解Ruby on Rails的页面缓存机制

2014-07-17  来源:本站原创  分类:ruby专题  人气:1 

这篇文章主要介绍了举例理解Ruby on Rails的页面缓存机制,本文来自于IBM官方网站技术文档,需要的朋友可以参考下

有了页面缓存,Rails 就可以不再介入。在某种程度上,这是件好事,因为您的确可以获得优秀的性能。Rails 只需创建 HTML 页面,将其放入目录,之后,就可以置之于脑后。从那时起,就由应用服务器管理这些页面,且页面进入应用服务器无需任何循环。从性能的角度而言,页面缓存真是天赐之福。

我也钟爱页面缓存,Rails 使之简单利落。只需使用一行代码就可以启用缓存。如果再加入一些代码,就能通过简单地删除文件操作或使用 Rails 较高层的 API 终止缓存。这里存在一个问题。并不是每个网站都能使用页面缓存。如果页面上的数据会根据访问它的用户而改变,那么就不能进行页面缓存。而且,如果很难判断页面何时到期终止,就会发现页面缓存的要求太过苛刻。

比如,几乎在每个页面上,ChangingThePresent.org(参阅 侧栏)都有某些用户数据是根据当前登录的用户而变化的。图 1 显示了我们最新主页的一部分。(我们一直在努力完善它,所以它有可能会改变。)这个页面呈现出的问题相对简单。如果能判断用户是否已经登录,就可以用 Flash、JavaScript、DHTML 或任何其他基于浏览器的代码动态定制视图。您会发现已登录的用户可以登出系统或查看其配置文件,而已登出的用户则可以注册或再次登录。
图 1. ChangingThePresent.org 上的登录和登出视图

举例理解Ruby on Rails的页面缓存机制

图 2 显示了稍微有些高级的用户数据视图,我们的站点就使用了这个视图。图 2 中的两个视图有极大的不同。为了处理页面缓存,我必须先解决所有的差异。对于每个已登录的用户,我都必须替换掉页面的登出内容,使之显示登录用户的登录 ID 和用户图片。缓存这些内容会带来另一层面的挑战,因为每个用户的数据都不尽相同。
图 2. 两个截然不同的视图

举例理解Ruby on Rails的页面缓存机制

这种情况并非 ChangingThePresent.org 所独有。如果需要个性化用户体验,那么不可修改的 Rails 页面缓存的使用就会受到限制。但如果定制不多,那么实际上还是能很容易地缓存这些页面的。

解决这些问题的方法很多。我更倾向于使用如下这些技巧:

  • 在 Rails 框架的约束之内,取消页面缓存并使用段缓存替代它。
  • 先加载页面的大部分,然后使用 JavaScript 和 Ajax 加载该页面较小的动态部分。服务器端代码可以检测用户是否登录,然后用 Ajax 呈现合适的部分。
  • 将某些用户状态(比如用户是否已登录)存储在客户端的 cookie 中。然后,根据 cookie 的内容,使用 JavaScript 动态更改页面的外观。

在这三种技巧中,我更喜欢第三种,因为第一和第二种技巧都会将 Rails 应用程序牵扯进来。要获得最大限度的可伸缩性,就要尽量多地使用静态内容。在本文中,我会侧重于介绍第三种方式。请不要使用该方法存储任何不能丢失的敏感数据,比如 ICBM 启动代码或信用卡号。对于我们所处理的这些有限的数据而言,这种方法效果很好。
使用 Show and tell 还是 hide and seek?

在我刚开始试着缓存这个主页时,我本可以简单地用 JavaScript 替换这些链接。可以将这种技巧看成是 Show-and-tell。基于我们对已登录用户的了解,可以使用 JavaScript 选择性地替换或注入 Web 页的部分内容,从而为用户提供正确的体验。为了进一步细分,我会进行如下操作:

  • 创建只具有所有用户的公共元素的 Web 页。
  • 当用户登录时,将一些有关该用户的数据存入 cookie,比如说登录信息。
  • 然后,使用 JavaScript 依据 cookie 的内容注入 HTML 段,借此填充该页面的剩余部分。

对于 ChangingThePresent 主页而言,show-and-tell 技巧有些威力过度,因为我只有两套链接要根据所登录的用户加以显示。因此,我选择了第二种技巧,我称之为 hide-and-seek。首先,显示出所有用户的公共页面元素,并通过每种数据可能 的隐藏版本显示页面的变化部分。这就是 hide 部分。然后,根据用户的角色使用 JavaScript 在文件中找到该用户的内容并显示出来。这就是 seek 部分。您可能会想,显示所有可能数据的版本有点威力过度,实际上,选择性地为不同的安全角色启用多种特性时,这种方式是十分常见的。hide-and-seek 方式非常适合 ChangingThePresent 主页。要实现这种方法,可以执行如下操作:

  • 创建只具有所有用户的公共元素的 Web 页。
  • 将用户按类型分区。为每个用户类型添加内容版本。就我的具体情况而言,ChangingThePresent 主页的用户类型包括登录用户和登出用户。最初,让此内容可见。
  • 当用户登录时,将一些可区分用户分组的数据存入 cookie,比如说用户角色或登录状态。
  • 当用户访问此页时,选择性地显示用户类型的内容版本。

实现 hide and seek

对于 ChangingThePresent 主页而言,hide-and-seek 实现起来异常简单。在之前的图 1 中,此主页有一个部分显示的是与用户帐户相关的一些链接。这些链接可以根据用户是否登录而变化。首要工作是构建此页的所有公共内容。我在本文并未给出具体做法。第二页需要显示出所有用户的全部动态内容,而不管用户是否已经登录:
清单 1. 在单一视图中创建动态内容的所有版本

<div id='logged_out'>
 <%= link_to "login", :controller => 'members', :action => 'login' %>
 <br />
 <%= link_to "register", :controller => 'members', :action => 'signup' %>
</div>
<div id='logged_in' style="display: none;">
 <%= link_to "your profile", :controller => 'profiles', :action => 'show' %>
 <%= link_to "logout" , :controller => "members", :action => "logout" %>
</div>

您可能已经注意到 my profile 链接。起初,该链接指向用户特定的配置文件,但这样可能会妨碍我们的主页缓存。相反,我只简单地将此链接指向了无任何用户 ID 的索引操作。然后,索引操作会将用户重定向到正确的配置文件页:
清单 2. 将用户重定向到正确的配置文件页

  def index
    redirect_to my_profile_url
  end

在清单 2,my_profile_url 是一个方法,该方法可以根据用户的类型(这可能是名人、顾问或会员)决定正确的配置文件 URL。每个用户类型都有一个单独的配置文件页。这时,程序的功能已经完成,您总共可以看到四个链接,logged_in 和 logged_out 各有两个链接:

  • login
  • register
  • your profile
  • logout

下一步,获取含有当前用户类型的 cookie。对于 ChangingThePresent,我在登录时创建了一个 cookie,其中含有当前的登录 ID。之后,在登出时再销毁这个 cookie:
清单 3. 在登录和登出时创建和销毁 cookies

def login
 if request.post?
  self.current_user = User.authenticate(params['user_login'], params['user_password'])
  ...

  if logged_in?
   set_cookies
   ...
  end
end

def logout
end

private

def set_cookies
 cookies[:login] = current_user.login
 cookies[:image] = find_thumb(current_user.member_image)
end

def logout
 cookies.delete :login
 cookies.delete :image
 ...

end

在清单 3 中,logged_in? 是一个私有方法,如果当前用户已登录则返回 true。上述的 Rails 方法会在您登录时创建三个 cookie,并在登出时删除它们。这里不需要为数据费神。尚且不需用到数据。可以这样理解:无需调用 Rails 框架,我就可以判断用户是否登录。我无需确保 cookie 到期终止是否与站点的到期终止规定相符。在我的例子中,二者是相符的,所以我现在尽可以开始页面缓存了。

下一步,根据用户的 cookie 选择性地隐藏和显示正确的条目。将如下的 JavaScript 代码添加到 public/javascripts/application.js 中:
清单 4. 支持 show and hide 登录 div 的 JavaScript 代码

function readCookie(name) {
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');
  for(var i=0;i < ca.length;i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1,c.length);
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
  }
  return null;
}

function handle_cached_user() {
 var login_cookie = readCookie('login');
  var logged_in = document.getElementById('logged_in');
  var logged_out = document.getElementById('logged_out');
  if(login_cookie == null) {
   logged_in.style.display = 'none';
   logged_out.style.display = 'block';
  } else {
   logged_out.style.display = 'none';
   logged_in.style.display = 'block';
  }
}

第一个函数从 Javascript 中读取 cookie 值,第二个函数处理此 DOM。可以通过使用 Prototype 库简化这段代码,但我包括了基本的 DOM 查找以便于读者理解。最后一步是在页面加载时调用 JavaScript 函数。我向布局中添加了如下代码:
清单 5. 当页面加载时调用 JavaScript 函数

  <script type="text/javascript">
   window.onload = function() {
     handle_cached_user();

     <%= render_nifty_corners_javascript %>
      <%= yield :javascript_window_onload %>
   }
  </script>

上述 JavaScript 代码十分简单。在页面加载时,将加载 handle_cached_user 函数,而它会相应地显示或隐藏正确的内容。现在,我尽可以通过向控制器中添加如下代码来启用页面缓存:

  caches_page :index

上述代码效果极佳。我还是需要定期地从缓存中删除前页,这样我才能使该页期满终止。为此,我只需简单地定期删除 public/index.html。hide-and-seek 方式对于有几类用户的页面十分有效,但对于如图 2 中所示的用户 partial 效果却不佳。对于后者,需要综合使用 hide-and-seek 和 show-and-tell 技巧。
实现 show-and-tell

再来看看 图 2。我将使用 hide-and-seek — 根据用户是否已登录 — 选择 partial 的正确版本,然后使用 show-and-tell 技巧根据我之前在清单 3 的行 4 和行 5 中所写的 cookies 的内容填充页面的动态部分。请记住,对于 show-and-tell,我特别更改了页面的元素以符合单个用户的情况。

首先,完成在这两个 partial (即登出用户和登录用户)上呈现的静态内容。我假设用户已经登出,所以我会通过附加 display: none 风格隐藏 logged_in div。之后,如果必要,我就可以用 JavaScript 显示或隐藏它们。请注意,我使用了相同的两个名称:logged_in 和 logged_out,来识别每个 div,这样便无需对我为这个主页所编写的 JavaScript 进行修改:
清单 6. 呈现登录和登出这两个 partial

<div class="boxRight sideColumnColor">
  <div id='logged_in'>
    <%= render :partial => 'common/logged_in' style="display: none; %>
  </div>
  <div id='logged_out'>
    <%= render :partial => 'common/logged_out' %>
  </div>
</div>

接下来,完成 logged_in partial 的内容。注意,每个包含动态内容的 HTML 组件都有一个 ID,从而我可以使用 JavaScript 找到它并随后将其替换:
清单 7. 显示 logged_in partial

<div id='logged_in' style="display: none;">

 <%= link_to %(<span class="mainBodyDark">Hi, </span>) +
    %(<span class="textLarge mainBodyDark"><b id='bold_link'>) + "my_login" +
    %(</b></span>), {:controller => 'profiles', :action => 'show', :id => 'my_login'},
 {:id => 'profile_link'} %>
 <br/>

 <div id='picture_and_link'>
   <a href="http://member/my_login" id='link_for_member_thumbnail'>
     <img id='member_thumbnail'
        alt="Def_member_thumbnail"
        src="/images/default/def_member_thumbnail.gif" /></a>
 </div>

 <div id="not_mine">Not my_login?</div>
 <br/>
 <%= image_button "logout", :controller => "members", :action => "logout" %>

如果对 Rails 有足够的了解,您可能会注意到其中的几个定制帮助程序函数。从中可以看到四处很明显的动态内容,我需要使用 JavaScript 为每个加载的页面替换这些内容:三处登录,一处会员图像。此处的 JavaScript 代码对 handle_cached_user 函数作了一处修改,并且还含有一个为动态用户处理页面更新的方法。针对本文的具体情况,我稍微对这段代码做了少许简化。可以将如下函数添加到 application.js 文件中:
清单 8. 替换用户 partial 的元素

function handle_user_partial() {
 var login_cookie = readCookie('login');
 var image_cookie = readCookie('image');

  var profileLink = document.getElementById('profile_link');
  profileLink.href = '/member/' + login_cookie;

  document.getElementById('bold_link').firstChild.nodeValue=login_cookie;

  document.getElementById('not_mine').firstChild.nodeValue="Not " + login_cookie + "?";

  document.getElementById('link_for_member_thumbnail').href="/member/" + login_cookie;

  document.getElementById('member_thumbnail').src=image_cookie.replace(/%2[Ff]/g,"/");

  document.getElementById('member_thumbnail').alt=login_cookie;

}

在清单 8 中,这个 JavaScript 函数首先读取此 cookies 并获取 DOM 树的一部分:即到当前的用户配置文件的链接,称为 profile_link。然后是 handle_user_partial 函数:

  • 将登录用户的名称(存储在 login_cookie 内)替换成 my_login 以为用户配置文件页创建正确的 URL。
  • 将登录用户名插入到 DOM 元素中,此元素使用粗体文本表示登录用户。
  • 将简单的句子 “Not login?” 插入到 DOM 元素中,这个元素包含 login partial 中的 logout 标题。
  • 找到包含会员图像的 dom 元素,将一般图像的 URL 替换成会员图像的 URL,会员图像保存在 image_cookie 中。
  • 此外,还要将此图像的 alt 标记替换成 login 名称,以防图像不出现。

在 DOM 中导航时,会发现有时需要直接转到 DOM 元素,而有时又需要转到该元素的特定子元素,比如在处理文本的时候。我就使用了 firstChild 函数根据需要寻找 DOM 元素的第一个子元素。由于语法更为友好,所以 Prototype 库使处理特定的 DOM 元素较为容易一些,但这超出了本文的讨论范围。

我已经创建好了所有的 cookies,最后一步就是从 handle_cached_user 函数调用 JavaScript。请记住,该函数在 public/javascripts/application.js中:
清单 9. 将 handle_user_partial 函数添加到 handle_cached_user

function handle_cached_user() {
 var login_cookie = readCookie('login');
  var logged_in = document.getElementById('logged_in');
  var logged_out = document.getElementById('logged_out');
  if(login_cookie == null) {
   logged_in.style.display = 'none';
   logged_out.style.display = 'block';
  } else {
  handle_user_partial();
   logged_out.style.display = 'none';
   logged_in.style.display = 'block';
  }
}

请注意,else 条件中的 handle_cached_user 函数下面还有额外两行代码。这两行代码可以在使 logged_in DOM 元素可见之前进行适当的替代。剩下所需做的就是使用本篇文章和 上个月 的那篇文章中所介绍的页面缓存指令来缓存整个页。
结束语

本篇文章中介绍的这种高级技巧为我们打开了许多方便之门。在 ChangingThePresent.org 上,我们估计使用非常简单的基于时间的清除器能够缓存超过 75% 的页面。通过使用稍微有些复杂的清除技巧,我们就能缓存超过 90% 的页面,而且还可能更多。如果您想试图影响我们的图像缓存计划,那么您只能触及应用服务器 1% 到 3% 的 Web 请求。

但同时,我们也应该看到不利的一面。我向此系统添加了明显的复杂性。我必须维护更加复杂的 HTML 代码,并确保 HTML 和 JavaScript 能够保持同步。但好的一面是在需要获得更好的性能时,我就能够使用最为简单和有效的缓存技术。您也可以尝试使用这种技巧 — 访问 ChangingThePresent.org 并加载主页。接下来,加载每个顶端的菜单。您会发现我们会页面缓存六个顶端菜单中的四个。创建一个帐号并重载每一个菜单。您能猜到哪个页面被缓存了么?在下一篇文章中,在继续深入真实世界中的 Rails 的同时,我将带您探究能增进 ActiveRecord 性能的一些技巧。

相关文章
  • 举例理解Ruby on Rails的页面缓存机制 2014-07-17

    这篇文章主要介绍了举例理解Ruby on Rails的页面缓存机制,本文来自于IBM官方网站技术文档,需要的朋友可以参考下 有了页面缓存,Rails 就可以不再介入.在某种程度上,这是件好事,因为您的确可以获得优秀的性能.Rails 只需创建 HTML 页面,将其放入目录,之后,就可以置之于脑后.从那时起,就由应用服务器管理这些页面,且页面进入应用服务器无需任何循环.从性能的角度而言,页面缓存真是天赐之福. 我也钟爱页面缓存,Rails 使之简单利落.只需使用一行代码就可以启用缓存.如果再加入一

  • 深入理解Ruby on Rails中的缓存机制 2014-05-19

    这篇文章主要介绍了深入理解Ruby on Rails中的缓存机制,本文来自于IBM官方网站技术文档,需要的朋友可以参考下 几个场景 首先,让我先来带您浏览几个 ChangingThePresent.org 中的页面吧.我将显示站点中几个需要缓存的地方.然后,再指出我们为其中每个地方所做出的选择以及为实现这些页面所使用的代码或策略.尤其会重点讨论如下内容: 全静态页面 几乎无变化的全动态的页面 动态页面片段 应用程序数据 先来看看静态页面.几乎每个站点都会有静态页面,如图 1 所示,其中还有我们的

  • 提升Ruby on Rails性能的几个解决方案 2015-02-03

    这篇文章主要介绍了提升Ruby on Rails性能的几个解决方案,本文来自于IBM官方网站技术文档,需要的朋友可以参考下 简介 Ruby On Rails 框架自它提出之日起就受到广泛关注,在"不要重复自己","约定优于配置"等思想的指导下,Rails 带给 Web 开发者的是极高的开发效率. ActiveRecord 的灵活让你再也不用配置繁琐的 Hibernate 即可实现非常易用的持久化,Github 和 Rubygems 上丰富多样的 Rails 插件是

  • 使用Ruby on Rails快速开发web应用的教程实例 2014-07-09

    这篇文章主要介绍了使用Ruby on Rails快速开发web应用的教程实例,本文来自于IBM官方技术文档,需要的朋友可以参考下 Ruby on Rails 正在令整个 Web 开发领域受到震憾.让我们首先了解底层的技术: Ruby 是一门免费的.简单的.直观的.可扩展的.可移植的.解释的脚本语言,用于快速而简单的面向对象编程.类似于 Perl,它支持 处理文本文件和执行系统管理任务的很多特性. Rails 是用 Ruby 编写的一款完整的.开放源代码的 Web 框架,目的是使用更简单而且更少的

  • 在Ruby on Rails中优化ActiveRecord的方法 2014-11-14

    这篇文章主要介绍了在Ruby on Rails中优化ActiveRecord的方法,本文来自于IBM官方网站技术文档,需要的朋友可以参考下 Ruby on Rails 编程常常会将您宠坏.这一不断发展的框架会让您从其他框架的沉闷乏味中解脱出来.您可以用习以为常的几行代码片断表达自己的意图.而且还可以使用 ActiveRecord. 对于我这样的一个老 Java? 程序员而言,ActiveRecord 多少有点生疏.通过 Java 框架,我通常都会在独立的模型和模式之间构建一种映射.像这样的框架就

  • Ruby on Rails中MVC结构的数据传递解析 2015-01-03

    这篇文章主要介绍了Ruby on Rails中MVC结构的数据传递解析,本文来自于IBM官方网站技术文档,需要的朋友可以参考下 如果读者已经开发过基于 Rails 的应用,但对其 MVC 间的数据传递还有诸多困惑,那么恭喜您,本文正是要总结梳理 Rails 数据传递的方法和技巧.Ruby on Rails 3(以下统称为 Rails 3)是当前的主要发布版本,本文所述及的内容和代码都基于此版本. Rails 3 简介 Ruby on Rails 是一个 Ruby 实现.采用 MVC 模式的开源

  • Ruby和Rails的缺点 2015-01-22

    有人说,robbin你说了那么多RoR的优点,你啥时候说说RoR的缺点阿?你说的缺点肯定比别人说的更客观.没办法,为了表现出来我不是一个RoR粉,只好总结点缺点,以飨RoR黑子们: Ruby和Rails的一些缺点的总结: ruby的问题我觉得主要是: 1.ruby本身的性能是比较差的,无法直接做一些计算密集型的任务 比方说大量的分词运算.语料训练什么的,用ruby写是不行的 2.ruby的C扩展很难写 正因为ruby性能差,所以很多情况下要依赖C写的底层库,但是写ruby的扩展C库是很困难的事情

  • 几个加速Ruby on Rails的编程技巧 2015-02-21

    这篇文章主要介绍了几个加速Ruby on Rails的编程技巧,本文来自于IBM官方网站技术文档,需要的朋友可以参考下 Ruby 语言常以其灵活性为人所称道.正如 Dick Sites 所言,您可以 "为了编程而编程".Ruby on Rails 扩展了核心 Ruby 语言,但正是 Ruby 本身使得这种扩展成为了可能.Ruby on Rails 使用了该语言的灵活性,这样一来,无需太多样板或额外的代码就可以轻松编写高度结构化的程序:无需额外工作,就可以获得大量标准的行为.虽然这种轻松

  • 浅析Ruby on Rails部署方案 2015-04-13

    前言 2006初,我接到了公司分配的一个遗留项目,让我负责一个基于C/S的系统的服务器端.其实是系统是基于HTTP协议的,因为负责客户端的同事对于服务器端编程不甚了解,虽然使用PHP对熟悉C++的他来说是驾轻就熟,但是在进一步实现更多的功能和更高的性能上就捉襟见肘了.项目是在非常突然的情况下交给我的,因为该同事在客户端上有更多的事情要做.我在分析了他的数据库结构和PHP源代码之后,决定按照与客户端的通讯协议重写他的服务器端.为了能应付老板苛刻的时间限制,我打算使用正在学习的Ruby on Rai

  • Web开发人员的利器:Ruby on Rails 2014-03-09

    工具发展简史 人类的发展就是工具的发展.从石器到木棒和矛,再到火器,我们学会了如何更有效地捕猎.从观看星像到指南针,再到海洋精密计时仪(marine chronometers)和全球定位系统(GPS),我们发现了如何更好地进行导航.从书信到电报,再到电话和互联网,我们将人类通讯的方式进行了革命.人类能够进行创新.我们能够发现解决问题的更有效的方法.我们能够创造更好的工具--这些工具对于我们所要解决的问题来说,显得更具有针对性和专门化,因而更为高效. 程序员也一样.优秀的程序员总是在寻找解决问题的

  • Radiant: 基于Ruby on Rails的内容管理系统 2014-04-09

    Radiant是一个开源的CMS[内容管理系统],建立于Ruby on Rails.Radiant是为一些小的开发团队而创建的[Publishing for Small Teams],因为它的相关操作需要一些编程知识.Radiant的操作界面很简洁[可以从文末的链接进入Demo],这为创建设计和内容提供了较高的灵活性. Radiant主要由三部分组成:页面,代码片断(比如包含PHP)和布局,这三个部分共同创建了一个系统核心,维持整个系统的运转. Radiant提供了一个灵活的网站结构,页面可以根

  • Ruby on Rails 之旅(六)--Ruby on Rails 简介 ( 少就是多) 2010-08-10

    转自:http://ihower.tw/blog/archives/1743 繁体字看着头痛,转成简体字给大家看 知名的 Web design 在线杂志 A List apart No.257期少见地刊出 Rails 入门介绍,心血来潮来做翻译,断断续续翻润了好几次,觉得文章看起来没什么,翻起来好长啊. 终于再度体会 text.plain 果然是最难写的格式.写投影片,做翻译比写程序还辛苦-orz 以下翻译自 Creating More Using Less Effort with Ruby o

  • Windows下Ruby on Rails开发环境安装配置图文教程 2013-10-02

    这篇文章主要介绍了Windows下Ruby on Rails开发环境安装配置图文教程,ROR初学者必看,需要的朋友可以参考下 本文详细介绍如何在Windows配置Ruby on Rails 开发环境,希望对ROR初学者能有帮助. 一.下载并安装Ruby Windows下安装Ruby最好选择 RubyInstaller(一键安装包). 下载地址: http://rubyforge.org/frs/?group_id=167 . 我们这里下载目前较新的rubyinstaller-1.9.3-p0.e

  • Asp.net禁用页面缓存的方法总结 2013-11-26

    这篇文章主要介绍了Asp.net禁用页面缓存的方法,需要的朋友可以参考下 1.在Asp页面首部<head>加入 Response.Buffer = True Response.ExpiresAbsolute = Now() - 1 Response.Expires = 0 Response.CacheControl = "no-cache" Response.AddHeader "Pragma", "No-Cache" 2.在HtML

  • 一个.NET程序员为什么学习Ruby on Rails? 2013-12-27

    你是一位资深的.NET程序员,而且已经用ASP.NET构建过许多Web应用. 无数个不眠之夜,为了让ASP.NET控件生命周期中的事件驱动模型按你想要的方式执行,你费尽心血,深入细节. 你精通于使用诸如Presentation Model.Model View Presenter这类设计模式对你的应用进行分层,以使其更易测试和维护. 你认为Ruby on Rails只不过是众多被吹嘘的技术中的一员.在它还没有获得可观的市场份额之前,你不会给予它过多的关注. 欢迎来到我的世界.如果你还在读这篇文章

  • 在Linux平台上安装和配置Ruby on Rails详解 2014-03-01

    ruby on rails推荐的生产运行环境是Linux/FreeBSD/Unix,即Unix系列的操作系统,采用lighttpd+FCGI的解决方案.以下我将以Linux操作系统,lighttpd+FCGI,MySQL数据库为例,从源代码编译安装开始讲解. 在安装之前,应该确认Linux操作系统已经安装好gcc编译器,否则请用Linux安装光盘先行安装gcc编译器: gcc –v 如能返回gcc版本号,则gcc正确安装. 一.安装Ruby解析器 一些Linux发行版本,MacOSX操作系统都自

  • 对Ruby on Rails进行高效的单元测试的教程 2014-08-04

    这篇文章主要介绍了在Ruby on Rails中进行高效的单元测试的教程,使用到了Ruby的RSpec和Factory Girl框架,需要的朋友可以参考下 在笔者开发的系统中,有大量的数据需要分析,不仅要求数据分析准确,而且对速度也有一定的要求的.没有写测试代码之前,笔者用几个很大的方法来实现这种需求.结果可想而知,代码繁杂,维护困难,难于扩展.借业务调整的机会,笔者痛定思痛,决定从测试代码做起,并随着不断地学习和应用,慢慢体会到测试代码的好处. 改变思路:能做到从需求到代码的过程转换,逐步细化

  • 在 Ubuntu 12.04 Server 上安装部署 Ruby on Rails 应用 2014-08-29

    本教程只适合 Ubuntu Server 用于部署项目到线上,建议使用同样的 Ubuntu 版本,以免遇到一些版本不同带来的问题 本教程只适合 Ubuntu Server 用于部署项目到线上,建议使用同样的 Ubuntu 版本,以免遇到一些版本不同带来的问题. 本教程适合新手初次部署 Rails 应用: 本文测试通过环境 Ubuntu 12.04 Server, 服务器安装测试于 Linode VPS (Ubuntu 12.04 LTS (GNU/Linux 3.4.2-x86_64-linod

  • Ruby on Rails下的图像处理入门教程 2014-09-25

    这篇文章主要介绍了Ruby on Rails下的图像处理入门教程,主要讲到如何用Rail的ImageMagick库来压缩图片,需要的朋友可以参考下 图像可以说是任何应用至关重要的一部分.从社交网络到一个简单的Bug追踪器,图像都扮演着重要的角色.然而管理图像并不是一件容易的事情,需要提前耗费大量的时间精力去计划. 本文演示了如何在Rail中实现这一目标.如何处理你的图像以及在后台创建多个版本?如何通过压缩图像又不损图像质量,以此来提高页面性能?这些且听本文一一道来. 入门 本文教程是运行于Rai

  • Ruby on Rails 2.1发布 2014-12-06

    Ruby on Rails 2.1上星期在Ruby On Rails的年度会议RailsConf上发布.今年的RailsConf在波特兰举行,而Rails的发布可谓如期而至. 官方消息是由Rails核心开发团队成员之一,Jeremy Kemper,在其RailsConf发言最后结束之时公布的.Riding Rails这个博客概述了新版本的具体情况,以下是部分摘录 : Rails 2.1现在已经可用了.它包括了自从2.0版本发布以来6个月中提交的特性和补丁.众多贡献者付出了大量的努力促成了这个版本