#14 楼 @citysheep 广州近半年以来基本是每个月一次,不过 6 月份因为大家都在忙,所以这个月跳票一次。每次参与人数不是很固定,多的时候有几十人(当然了,其中也有一些是猎头而已),少的时候就是十来个人。实际上广州这边的 Rubyist 应该挺多的。深圳那边的情况貌似差不多,但是因为不是很清楚,所以不便过多下定论。如果是初期办公室的话,建议还是尽量一线城市,毕竟这些城市招靠谱 Rubyist 都比较难招了,就别指望基数更少的二线城市了。
原来是 @caiqinghua 的团队,过来支持一下!人很 nice,大家可以考虑。
我猜测下吧,以 iphone 为例,微信运动是用的 ios 的 HealthKit,可以通过接口读取到用户的运动健康数据。 另外微信目前并没有开放健康数据的接口给公众号,所以理论上来说是不可行的。 最后,请楼主自行查阅文档 http://mp.weixin.qq.com/wiki/home/index.html 。
建议用专业做邮件发送服务的,比如 Mailgun, Mailchimp, Sendgrid 这些。QQ 邮箱跟 163 邮箱这些容易被限制。
@ruby_sky 不是有一个微信公众平台开发者论坛吗?
#18 楼 @peter 就是把消息作为内容,在代码里边只用一些必要的 key,避免代码中硬编码:
首先是先为各个事件定义好消息模板,我们约定所有事件对应的消息在 yaml 中的格式是 "%{language}.events.%{event_name}":
# config/locales/zh-CN.yml
zh-CN:
events:
new_order: "新建需求"
start: "进入交付阶段,负责人:%{person_in_charge}"
# ...
接着定义方法,这个方法其实只是实现了上面的约定,即所有事件的消息都从 "events.#{event}"
这个 key 读取。
# app/models/concerns/order_auditing.rb
class OrderAuditing
extend ActiveSupport::Concern
# 返回某个事件的审计记录内容
# @param event [Symbol, String] 时间名称, e.g. "new_order"
# @param options [Hash] optional 额外的信息,此参数将会直接传递给底层的 I18n,用于直接渲染人类可读的信息
# @return String 对应 event 的消息内容, e.g. "新建需求", or "进入交付阶段,负责人:黄晓明"
def event_message(event, options = {})
I18n.t("events.#{event}", options)
end
end
最后的用法就是:
class Order < ActiveRecord::Base
# callback 的逻辑根据实际需求写,这里仅为示例,非真实代码
before_transition on: :new do |transition, _|
self.paper_trail_event = event_message(:new_order) # 相当于 `self.paper_trail_event = "新建需求"`
# or
# self.paper_trail_event = event_message(:start, person_in_charge: user.name) # 相当于 `self.paper_trail_event = "进入交付阶段,负责人:xxxx"`
end
end
实际上就是将消息内容与代码本身分离,很多场景下我都是使用 i18n 的文件来处理这种“事件 - 消息”的映射关系的。
写完才感觉,自己又班门弄斧了!
@qhwa 昨天已发,请问有收到吗?
#3 楼 @shenchao890216 比如 http://api.rubyonrails.org/classes/ActiveModel/Validations/HelperMethods.html#method-i-validates_presence_of 这个可以传递 :message
参数。
:message - A custom error message (default is: “can't be blank”).
如果是 validates
方法的话,根据 activemodel 源码,应该可以是:
validates :field_name, presence: {message: '自定义消息,比如必须填写field_name'}
#3 楼 @kevinclcn 都是直接代码生成的啊
#6 楼 @flowerwrong 同问
Rack 只是一个中间件架构的实现,Rails 本身就是基于 Rack + 其他很多中间件组成的,不信?你在 Rails 项目根目录下执行 rake middleware
,就可以看到你的项目当前的中间件列表及其顺序了:
use Rack::Sendfile
use ActionDispatch::Static
use Rack::Lock
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x00000105bb4328>
use ActiveRecord::Migration::CheckPending
# ... others
use Rack::ConditionalGet
use Rack::ETag
use Warden::Manager
use Bullet::Rack
run ProjectName::Application.routes
关于 Rack 的介绍,网上其实非常多资料: https://www.amberbit.com/blog/2011/07/13/introduction-to-rack-middleware/ https://vimeo.com/user12143456/review/69109140/c72efbd052 http://guides.rubyonrails.org/rails_on_rack.html
还有一个非常棒的视频叫做《Rebuilding a Ruby web server》,可以了解 Ruby 基于 Rack 的 Application Server 的架构。
所以说,我现在才看到,是已经晚了么?
#39 楼 @yueyeweiming 哈哈 (⊙o⊙)
#1 楼 @yueyeweiming 买包送笔记本可好?
#5 楼 @marksloan 你们是采用的下单即更新库存的方式?如果是一定要这么做的话,可以考虑用 sidekiq,然后设定 24 小时后检查这张订单。如果是在失效时间内已经支付,可以同时从定时队列中移除这个任务。
首先定义一个“苦逼”的 worker 来干活:
# app/workers/order_expiration_checker.rb
class OrderExpirationChecker
include Sidekiq::Worker
def perform(id)
order = Order.find id
do_some_stuff if order.unpaid? && order.expired? # 订单未支付,并且已经超过有效期
end
end
然后在每次下单时,自动将订单加入定时任务,24h 后执行检查:
# app/models/order.rb
class Order < ActiveRecord::Base
after_create :check_expiration
def expired?
created_at + 24.hours < Time.now
end
private
def check_expiration
OrderExpirationChecker.perform_in(24.hours, id)
end
end
#3 楼 @tracyzhang 嗯嗯,怎么解决怎么来。