• 说说 Rails 的套娃缓存机制 at 2014年10月05日

    #52 楼 @linjunzhugg 我不能直接回答你的问题,下面是我的一些理解,希望能你有帮助。

    说一说 Cache Key

    1) record 的 cache_key

    2) helper 方法 cache(name = {}, options = nil, &block) 这里的 name

    3) 内存数据库 key

    不严格区分的话,它们都可以叫做"Cache Key"

    但,你可以把它们区分开来:

    post.cache_key
    => "posts/1-20140921032815201680000”
    
    <% cache [ 'a_post', post ] do %>
      … ...
    <% end %>
    
    views/a_post/posts/1-20140921032815201680000/9746fd05c8428f7999681aa804071e9a
    (路径    helper方法cache的name部分    静态内容md5)
    

    特点:

    1 由 record 的"id + updated_at 时间戳"组成,所以 record 更新,cache_key 会更新 (update_column 等情况不讨论)

    2 由我们指定,所以理论上可以随便写。没有嵌套缓存的情况下,一般可以直接使用 1;有嵌套的情况下可以用 touch 更新父亲资源或者使用一个组合,如:cache [current_user, post]

    3 根据 2 生成 (但不等于 2),要求唯一 (要不然就没意义了)

    2 每次请求都要计算

    2 计算之后和 3 对比是否匹配。不匹配则生成新的内容,渲染页面;匹配则返回,渲染页面

    2 不匹配,那么意味着之前的内容过期了,过期的内容还是继续存在的数据库里的。(这里的过期不等于被删除)

    2 过期的内容可以由我们手动删除,如:Rails.cache.clear;或让数据库自动删除,如 config.cache_store = :redis_store, 'redis://localhost:6379/5/cache', { expires_in: 90.minutes } 这里数据最多只能在 redis 里保存 90 分钟,到期的缓存数据会被删除。(这里的到期等于被删除)

  • 2 楼已经回答你了,Rails 默认有:

    WelcomeController 新建 Rails 项目时,默认首页 index

    MailersController 邮件预览的 index 和 preview 页面

    InfoController 项目信息页面,包括:index、properties、routes

  • 说说 Rails 的套娃缓存机制 at 2014年10月03日

    从使用的角度出发,我归纳了几条片段缓存相关的规则,特别是嵌套的情况:

    1. 缓存由动态内容和静态内容两部分构成。

    2. 动态内容的 cache_key 由我们指定;

      1. 没有嵌套的情况下,如果动态内容不指定 cache_key,则自己的动态内容永远不会更新 (例外见最后);
      2. 有嵌套的情况下,如果动态内容不指定 cache_key,则自己的动态内容 & 孩子的动态内容永远不会更新 (例外见最后);
    3. 没有嵌套的情况下,有且只有自己的 cache_key 更新,动态内容才更新;

    4. 有嵌套的情况下,有且只有自己的 cache_key 更新 & 父亲的 cache_key 更新,动态内容才更新;

    5. 动态内容的更新,不影响静态内容的部分;

    6. (各动态内容的 cache_key 是独立的,自己及其父亲、兄弟、孩子的 cache_key 没有依赖关系)

    7. 无论哪的静态内容更改,有且只有重启后更新,不存在 (也不用考虑) 嵌套的问题;

    8. 静态内容的更新,不影响动态内容的部分 (例外见最后);

    9. 例外:动态内容没有指定 cache_key,只有静态内容同时更新,并且重启,动态内容才会更新。

    有遗漏/不对的地方,请楼主&其他人员...补充/指正。

  • #3 楼 @tiseheaini 都走到这一步了,可以再往下走一点,Rails 有 current_page? 可以用:

    条件复杂可以再抽取出来成 helper
    <% if current_page?(条件 ...) %> 
      <%= render 'layouts/home_header' %>
    <% end %>
    

    根据复杂度不同,楼主还有不同处理方式,可以参考以上几位建议...

  • Ruby 为什么要抄袭 Python? at 2014年09月15日

    你来打我啊...

  • 天呐... 区别已经很明显了,还有人理解得这么'深入',有的地方还理解错了。

  • #5 楼 @small_fish__ #7 楼 @jasl rack-utf8_sanitizer 可以干掉这些非法字符。你说的 Rack::Utils,应该类似 escape_utils ... 它们不是一个事。

    来一个测试,这里包含了非法字符 curl http://rails-bestpractices.com/search\?utf8\=%E2%9C%93\&search\=foo%E0\&commit\=Search 不要一直玩...!

  • 吐槽一下 Ruby China at 2014年09月09日

    "瞎扯淡"和"招聘"一样独立出来就更满意了。有需求的人会点击查看的~

  • #2 楼 @jypandjip 当你看完 Rails 4 的 scope 不知道你有没有后悔抱着 2.3 不放。祝你好远

  • 夜半扯淡…… at 2014年06月05日

    #5 楼 @blacktulip [邻家]

  • rails 4 的改进导图 at 2014年05月26日

    Ruby on Rails 4.0 Release Notes 楼主是不是都要补上?

  • 我对待技术学习的态度 at 2014年05月20日

    第六,很长的一段话,换行更利于阅读。

    • 客户端缓存,在这里指的应该就是 ETag 了吧,现在已经做为 middleware,默认对静态和动态内容做缓存。只要有一个改动,都会刷新。fresh_when 设置不好,缓存失效反而容易出错。
    • Page Caching 和 Action Caching 都已经废弃。
    • 建议加上"对象缓存",和数据查询有点类似。

    坐等楼主更新!

  • 几小时,几天,试用:国内的 IaaS,便宜好用,速度快。推荐青云,注册好像还送两块钱,可以玩几个小时了。计费精确到秒,不想用就关闭,不浪费。

    几个月,一两年:国外的 VPS。对比国内便宜,速度还能接收 (别把它们想得太糟)。不推荐 Linode,太贵,我用过 BurstNET。内存不必超过 1G

    PaaS: 不推荐。包含 heroku,国外的速度慢,使用上和服务器差别大。而且限制大,折腾多。

  • 楼主发的链接里的模板可以采用。

    它有点类似 Bootstrap,自己写 html + 给定的 css 名字即可;"wrap 上下了这个发现和 rails 应用差异很大"不存在这个问题。 自己写 layout,不过你可以参考它本身的。不存在 assets 的概念,主要用到的 css, js 都很互相之间都很独立。你看到的是 html 静态页面,里面引用 css,js 很规范,也有注释。 css 里面有压缩和未压缩的,用哪个自己决定。

    就评论这么多了吧。

  • attribute :age, Integer 要的不是字符串呢

  • 招人。。。 你想得简单了,Runtime 解决不了问题。openshift, cloudfoundry 对 ruby 的支持都不是很好...这个功能你让"外人"能做好?

  • "主要看中 enum 功能"很容易啊,一两分钟的事,把 enum 这个文件 hack 进来就行了(note:里面的 update! 换成 update_attributes!)

  • <%= link_to "More", "javascript::void()", id: "more-info-#{item.id}”, class: “more-info" %> 
    
    <div id="more-info-<%= item.id %>-content" style="display:none”>
       <%= item.id %> Hello world
    </div>
    
    _.each($('.more-info'), (ele)->
      content = $("#" + $(ele).attr('id') + -content").html()
      $(ele).popover
        html: true
        placement: 'right'
        content: content
    )
    
  • 里面的方法是类方法,和 def self.xxx 功能一样

  • 👍

  • 基于 AJAX 的按钮实现。 at 2014年03月19日

    看看 create 和 destroy 是如何增删元素的 Rails 的 CRUD 在一个页面内实现,供参考

  • :post @post 是等同的吗? at 2014年03月17日

    尽量用 :post,有时候我们会忘了 new,虽然很少见。

    这是我一次踩坑记录: 为什么要在 form_for 里把 @xxx 改为 :xxx

    <%= form_for(@order_status_history, :url => {:controller => 'orders', :action => 'show'}) do |f| %> 会有 undefined method 'model_name' for NilClass:Class 报错。

    而用 :order_status_history 则没问题。

    其它情形:http://stackoverflow.com/questions/11360704/undefined-method-model-name-for-nilclassclass