分享 5 个常见的 Rails 开发误区

lgn21st · 发布于 2012年5月15日 · 最后由 ekim_sgra 回复于 2012年5月16日 · 3019 次阅读
3

原文刊载在 ITey.com 上,推荐阅读: http://www.iteye.com/news/25074

  1. 没有 schema 规范的迁移
  2. 面向对象编程
  3. 在 helpers中连接HTML
  4. Giant Queries(大查询,比如载入整张表的查询)会把一切都加载到内存
  5. 代码审查
共收到 11 条回复
96
Guest · #1 · 2012年5月15日

都是实打实的经验啊

96
pongyo · #2 · 2012年5月16日

原文这里:http://www.mikeperham.com/2012/05/05/five-common-rails-mistakes 评论里很多不同人的经验 作者有很多异步和高性能Rails开发的经验。他最近搞的sidekiq 据说比resque性能

96
Guest · #3 · 2012年5月16日

我感觉rails way不是oo way,rails本身的一些东西会误导开发者,比如它的表单,特别是嵌套表单,写习惯很容易让开发者觉得暴露对象内部结构是再正常不过的事情。再比如它的try方法,也同样让开发者养成不封装的习惯。还有关联对象的一些方法例如:user.books.build/create、user.books << book等等。所以第2点挺正常的。

594
ery · #4 · 2012年5月16日

第3点 在 helpers中连接HTML

我们遇到的问题是

content_tag :url do
  content =  content_tag(:li, '1') 
  content += content_tag(:li, '2') 
  content += content_tag(:li, '3')
  content += content_tag(:li, '4') if some_thing
end

很多加号,感觉很怪异

我们的写法是这样

contents_tag :url do |contents|
  contents << content_tag(:li, '1') 
  contents << content_tag(:li, '2') 
  contents << content_tag(:li, '3')
  contents << content_tag(:li, '4') if some_thing
end

contents_tag函数如下

def html_contents
  contents = []
  result = yield contents
  if contents.count > 0
    contents.join(' ').html_safe
  else
    result
  end
end

def contents_tag(tag_name, options = {}, &block)
  self.content_tag tag_name, options do
    self.html_contents(&block)
  end
end
162
quakewang · #5 · 2012年5月16日

#4楼 @ery 好像没有必要吧,如果不喜欢用 +=,string也有<<方法:

content_tag :ul do
  contents = content_tag(:li, '1')
  contents << content_tag(:li, '2')
  contents << content_tag(:li, '3')
  contents << content_tag(:li, '4') if some_thing
  return contents
end
594
ery · #6 · 2012年5月16日

#5楼 @quakewang 有点时候我也在想,是不是没有必要,是不是有更加简单的方法。

我写那两个函数主要解决的以下问题,

当content_tag中的第一个内容的值,不是必然存在, 是否存在,需要逻辑判断,来决定的时候, 比如

content_tag :ul do
  contents = ''
  contents << content_tag(:li, '1') if some_thing
  contents << content_tag(:li, '2')
  contents << content_tag(:li, '3')
  contents << content_tag(:li, '4') if some_thing
  contents.html_safe
end
947
chinacheng · #7 · 2012年5月16日

#5楼 @quakewang 是不是喜欢与不喜欢的问题,是性能的问题

irb> s = a
=> "a"
irb> s.id
=> 24113052
irb> s << "b"
=> "ab"
irb> s.id
=> 24113052
irb> s += "c"
=> "abc"
irb> s.id
=> 24201084
160
sandy_xu · #8 · 2012年5月16日

对第一点的看法是:如果在 schema文件中定义,那么不能轻易在Model中 修改。而且保存失败还不容易找到,有点像双刃剑吧。

8
hooopo · #9 · 2012年5月16日

#7楼 @chinacheng 脱离Benchmark、Profiles来扯性能问题都是耍流氓

947
chinacheng · #10 · 2012年5月16日

#9楼 @hooopo 请赐教啊,说的详细一点,哈哈

96
ekim_sgra · #11 · 2012年5月16日

content_tag 那个倒是第一次知道,最近自己写helper也是字符串连接满天飞啊 = =b

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册