#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
从使用的角度出发,我归纳了几条片段缓存相关的规则,特别是嵌套的情况:
缓存由动态内容和静态内容两部分构成。
动态内容的 cache_key 由我们指定;
没有嵌套的情况下,有且只有自己的 cache_key 更新,动态内容才更新;
有嵌套的情况下,有且只有自己的 cache_key 更新 & 父亲的 cache_key 更新,动态内容才更新;
动态内容的更新,不影响静态内容的部分;
(各动态内容的 cache_key 是独立的,自己及其父亲、兄弟、孩子的 cache_key 没有依赖关系)
无论哪的静态内容更改,有且只有重启后更新,不存在 (也不用考虑) 嵌套的问题;
静态内容的更新,不影响动态内容的部分 (例外见最后);
例外:动态内容没有指定 cache_key,只有静态内容同时更新,并且重启,动态内容才会更新。
有遗漏/不对的地方,请楼主&其他人员...补充/指正。
#3 楼 @tiseheaini 都走到这一步了,可以再往下走一点,Rails 有 current_page? 可以用:
条件复杂,可以再抽取出来成 helper
<% if current_page?(条件 ...) %>
<%= render 'layouts/home_header' %>
<% end %>
根据复杂度不同,楼主还有不同处理方式,可以参考以上几位建议...
你来打我啊...
天呐... 区别已经很明显了,还有人理解得这么'深入',有的地方还理解错了。
#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
不要一直玩...!
"瞎扯淡"和"招聘"一样独立出来就更满意了。有需求的人会点击查看的~
#2 楼 @jypandjip 当你看完 Rails 4 的 scope 不知道你有没有后悔抱着 2.3 不放。祝你好远
#5 楼 @blacktulip [邻家]
Ruby on Rails 4.0 Release Notes 楼主是不是都要补上?
第六,很长的一段话,换行更利于阅读。
坐等楼主更新!
几小时,几天,试用:国内的 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 功能一样
看看 create 和 destroy 是如何增删元素的 Rails 的 CRUD 在一个页面内实现,供参考
尽量用 :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