#18 楼 @rbprocareer sinatra 也可以用 AR,见 sinatra-activerecord
我们现在这样做的,将 rescue_from formate 成约束的协议,然后定义正常的 formatter 和出错时的 formatter
rescue_from ActiveRecord::RecordNotFound do |e|
Rack::Response.new(
{
meta:{
status: :not_found,
msg: e.message
}
}.to_json, 404).finish
end
...
...
formatter :json, lambda {|object,env|
{ :meta => { status: :ok, msg: "" }, :data => object }.to_json
}
error_formatter :json, lambda { |message, backtrace, options, env|
{ :meta => { status: message[:status], msg: message[:msg] }}.to_json
}
碰到需要容错的地方,用 grape 提供的 error!
error!({ msg: 'Email has been registered', status: :registered }, 200)
#返回值
{
"meta": {
"status": "registered",
"msg": "Email has been registered"
}
}
然后正常的返回是这样
order = Order.first
present order, with: Entities::Order
# 返回值
{
"meta": {
"status": "ok",
"msg": ""
},
"data": {
"id": 278,
"text": "order1"
}
}
#ActiveRecord::RecordNotFound
{
"meta": {
"status": "not_found",
"msg": "Couldn't find City with 'id'=22"
}
}
Entity(模板)仅仅定义需要对外暴露的 data,而不需要去关心 meta
初期的产品简单的 token 就足以,然后再去慢慢迭代安全相关的特性
class User < ActiveRecord::Base
# ..code..
devise :database_authenticatable,
:invitable,
:registerable,
:recoverable,
:rememberable,
:trackable,
:validatable
attr_accessible :name, :email, :authentication_token
before_save :ensure_authentication_token
def ensure_authentication_token
self.authentication_token ||= generate_authentication_token
end
private
def generate_authentication_token
loop do
token = Devise.friendly_token
break token unless User.where(authentication_token: token).first
end
end
module API
class Root < Grape::API
prefix 'api'
format :json
rescue_from :all, :backtrace => true
error_formatter :json, API::ErrorFormatter
before do
error!("401 Unauthorized", 401) unless authenticated
end
helpers do
def warden
env['warden']
end
def authenticated
return true if warden.authenticated?
params[:access_token] && @user = User.find_by_authentication_token(params[:access_token])
end
def current_user
warden.user || @user
end
end
mount API::V1::Root
mount API::V2::Root
end
end
我们用geocoder完全可以达到效果
distance = 20
center_point = [40.71, 100.23]
box = Geocoder::Calculations.bounding_box(center_point, distance)
Venue.within_bounding_box(box)
3 年多了镁光 M4,一直很稳定
不太好判断, 初步估计是 dependency 的问题 你的 Pinglun 的 Engine 应该要 dependency 了你的主项目的。
你应该设计一个基础验证,包含在你的 core 里面,一般不要涉及第三方的认证 Gem,然后再通过 engine 去扩展你的认证,这时候再是用第三方的 Gem 比较合适。 因为你加一个 Rails Engine 的时候,基本都会要用到你的认证
我的 Pro 15,光驱位一直没换,原来的硬盘位直接换了一个镁光的 M4 256,你就买两个螺丝刀就可以了,一个拧后盖,一个拧硬盘上的固定架(内八角什么的,不太记得了)
这个就好像要把夫妻生活也搬到线上进行
这不是解决办法 我觉得可以采用一些机制来过滤。 类似 stackoverflow、HN。
你可以把 erb 理解成 html http://html2slim.herokuapp.com
用 polymorphic http://guides.rubyonrails.org/association_basics.html#polymorphic-associations
不过我也觉得用 tag 比较合适,不过这个 categories 可以作为节点
站内信?
@andor_chen 建议把译文放到豆瓣阅读去
支持 LZ 工作,PDF 已购买
我们的 IM 产品就是采用的 XMPP 和 Ejabberd,非常不错。 我觉得选用通用的协议更好,像微博 Chat、Gtalk、人人 Chat 都是使用的 XMPP 不过我很不喜欢 XML,这点让 XMPP 的数据传输有些冗余,但是这个不重要,这个不会在你初步阶段成为障碍 移动终端,无论是 iOS 还是 Andriod,还是 Web 包装耗电量和流量消耗都完全是可以接受的。
试试 goaccess
jinxing.ding#icloud.com
losingle#gmail.com
一般采用 link_to_unless_current,如果实现不了再自己写 Helper.