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

lgn21st · May 15, 2012 · Last by ekim_sgra replied at May 16, 2012 · 5118 hits

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

  1. 没有 schema 规范的迁移
  2. 面向对象编程
  3. 在 helpers 中连接 HTML
  4. Giant Queries(大查询,比如载入整张表的查询)会把一切都加载到内存
  5. 代码审查
Unknow user #1 May 15, 2012

都是实打实的经验啊

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

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

第 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

#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

#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

#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

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

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

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

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

You need to Sign in before reply, if you don't have an account, please Sign up first.