#17 楼 @numbcoder 只看过简单 JSON API 项目的人很难理解 Parameter Validation and Coercion 的重要性
首先,强烈建议用时间戳; 实在是喜欢字符串格式,也一定要用 iso8601
.
Grape 是有内置 data format
的,先定义一个 helper:
module Grape
class Entity
format_with(:unix_time) { |dt| dt.to_i }
format_with(:iso8601) { |dt| dt.iso8601 }
end
end
Entity
里面可以这样用:
class Foo < Grape::Entity
root 'foos', 'foo'
with_options(format_with: :unix_time) do
expose :created_at, :updated_at
end
end
#12 楼 @numbcoder https://github.com/rails/rails/issues?q=is%3Aopen+is%3Aissue+milestone%3A5.0.0+label%3A%22release+blocker%22
这个 release blocker
已经挂了一个月了,感觉发布碰到瓶颈了啊
#22 楼 @catherine 防止 SQL 注入
这不是 where
的锅~ MySQL 下可以用 filed 来解决
module Extensions::ActiveRecord::FindByOrderedIds
extend ActiveSupport::Concern
module ClassMethods
def find_ordered(ids, table_name)
return where(id: ids) unless ids.present?
sanitized_id_string = ids.map {|id| connection.quote(id)}.join(',')
where(id: ids).order("FIELD(#{table_name}.id, #{sanitized_id_string})")
end
end
end
ActiveRecord::Base.include(Extensions::ActiveRecord::FindByOrderedIds)
A.find_ordered([3, 1,2,5])
就会按顺序查出来了。
自顶向下,逐步锁定的思路很赞~
不过回想起来,如果在最开始就花十五分钟尝试一遍潜在的常见问题,会省不少时间。或许可以做个小工具,依次检查:
#4 楼 @killyfreedom 不仅 ab 不可信,mac 也不可信,参考 Passenger 给出的 benchmark 指南。
https://www.phusionpassenger.com/library/config/apache/optimization/#benchmarking-recommendations
Cookpad 不是号称全世界最大的单一 Rails App 么?怎么也搞微服务了
-
上班坐久了需要站立十分钟、远眺一分钟,每天的日常任务早睡早起
, 这些达不到健身的效果
Singleton Class
和 Singleton Pattern
不是一回事吧
文章比代码长系列~
好赞啊,啥时候来杭州开分公司啊
新版的还不错啊,已经很像Travis CI
了,唯一的遗憾是不支持 跑不通测试不允许合并 PR
对外显示的也变了啊:
present StoreCustomer.find(params[:id]), with: ::Entities::CustomerSummary
present StoreCustomer.find(params[:id]), with: ::Entities::Customer
多表关联的场景用 delegate
更好吧
class Customer < ActiveRecord::Base
has_one :girl
delegate :name, to: :girl
end
class Customer < Grape::Entity
expose :name
end
又或者这样:
class Customer < Grape::Entity
expose :name
private
def name
object.girl.name
end
end
params validation
应该是 Grape
最好用的特性之一,配合 Swagger
很方便
pull request
+ code review
代码风格和质量控制的工具有使用,但是仅供参考
if
as
module Entities
class CustomerSummary < Grape::Entity
expose :age, :name
expose :phone_number, as: :login_name
end
class Customer < CustomerSummary
expose :phone_number, :login_name
end
end
用 Grape 的话,就用它提供的 params validation
吧,没必要再用 strong params
class Something
def title=(val)
write_attribute :title, val.strip
end
end
Rails 5 中有了另一种写法:attribute :title, StripString.new
.
setter
要比 callback
清晰不少。
42thcoder , 已注册
人肉测试啊啊啊
分母 +1
gem 'migration_comments'
写迁移的时候这样写:
add_column :topics, :visitors_count, :integer, default: 0, not_null: false, comment: '围观者计数'
这样 annotate-models
生成的注释和数据库表都会有注释的。
dmesg -T
看一下