不行
实现不了的,没办法统一添加,只能为每一个需要修改核心方法的类添加 using
语句。
Refinements 作用域只有顶级、Module 和 Class,且遇到 end
就停止了,不能用在 Method 上。
You may activate refinements at top-level, and inside classes and modules. You may not activate refinements in method scope. Refinements are activated until the end of the current class or module definition, or until the end of the current file if used at the top-level.
给你补上例子
class A
def initialize
@path=''
end
def path
@path
end
end
class B < A
def initialize
@path='b'
end
end
class C < A
def initialize
@path='c'
end
end
obj= B.new
puts obj.path
像你这种情况是不想公用属性啊,那应该用实例变量而不是类变量。
但要记得实例变量区分类和他的单例类两个作用域,因此要把初始化的操作移到构造函数中,像上面在类中初始化会得不到你期望的效果
首先这段代码最后的结果就是 c
,最简单的,开一个 irb 把代码都粘贴上去验证一下就行了。你上面提到的 Nginx 结果没有什么问题,至于 rails s 结果错误,肯定是因为别的原因(我猜想你的 B, C 都是自动加载类,然后实际上验证结果时 C 没有加载或者 B 在 C 之后加载的)。
至于结果为什么是 c
,是因为 Ruby 的类变量会和所有子类以及他们的单例类共享的,即在上述的所有作用域中 @@path
的内存指向都是一样的。
class A
@@path=''
def path_object_id
@@path.object_id
end
def self.path_object_id
@@path.object_id
end
puts path_object_id # => 70139278257540
puts self.new.path_object_id # => 70139278257540
end
class B < A
puts @@path.object_id # => 70139278257540
puts self.new.path_object_id # => 70139278257540
end
class C < A
puts @@path.object_id # => 70139278257540
end
可以用继承钩子解决你的问题,Class#inherited
records.each_with_object({}) do |record, hash|
record.each do |k, v|
hash[k] ||= 0.0
hash[k] += v
end
end
你这个伪装骗过了服务器,但没有骗过浏览器,浏览器还是当成 AJAX 请求处理
重定向是浏览器才有权利做的事情,服务端只能作出指示。
如果是普通请求,浏览器收到服务端重定向 (3xx 状态码) 的指示后,会自动再向指示的地址发送一个请求,达到页面刷新。
如果变成了 AJAX 请求,浏览器是不会响应重定向状态码指示的,这时候可以用 #3 上面说的方法,渲染一段 JS 代码给浏览器,浏览器收到后会执行实现页面刷新
会很有帮助,收集一下大家的主要问题回答。但是最后还是要汇集展现出来,说到底社区还是需要原来的 Wiki 这样的教程,现在是内容无法及时更新的问题对吧。
第一步,可以从翻译已有的文档开始:
后面可以对国情添加一些指导,这样对新人的帮助也是一个很大的提高(新人经验少,如上面所说社区已有帖子各种教程个人观点多,对他们来说筛选起来并不简单,大多数人更希望能有一个 Wiki 或 Guides 的东西直接指导怎么做)
没这个需求。(要打卡可以找虚拟定位)
是的
对,跟你定义的变量 value 没有任何关系
把 value = 5 这一行去掉就好理解了
写错了,fn = method(:appendX)
也有被动的情况,比如对接方文档在先,并且规定只能用 POST 和 GET 动作。此时就应该完全放弃 RESTful,重新定义一个标准。如果继续强求 RESTful,无法实现的接口再绕个弯(删除,修改操作用 collection)之类的,可能更会把接口定的不伦不类的。
好像都是顶的人,为啥没人指出"一年半以内完成 Ruby 转 golang 的开发"这个啊,是招过去之后要全部转岗吗
我对待这类异常的做法是直接从根源上处理,该捕获的直接捕获。虽然搞懂这些一个个异常比较麻烦,但是可以一劳永逸,且写成 lib 共享后,其他项目也可以不再受这些烦恼。
例如简单的有刷接口,访问不存在路径的异常(线上不会报,但是日志会记录一大堆异常堆栈),可以在路由最下方使用 match 匹配所有路径的处理方式。另外像麻烦一点的有 Rack 层的参数解析异常,别人非得设置 json headers 然后在用一串非的 json 格式的参数数据请求你接口,这时候可以 加上中间件拦截 这类明显不正常的请求。
去掉这个就行:
def default_url_options
{locale: I18n.locale}
end
感觉异步更新索引不传递 record,而是在回调里构建好 elasticsearch 需要的数据传到 job 更好一点,可以很好的实现回调时 record 的状态和执行 job 时 record 的状态统一,避免了上述执行任务时记录已经不存在(或不统一)的情况:
# app/models/concerns/searchable.rb
after_destroy_commit do
SearchIndexerJob.perform_later('delete', self.class.index_name, self.class.document_type, id)
end
# app/jobs/search_indexer_job.rb
def perform(operation, index, type, id, body = nil)
client = Elasticsearch::Model.client
case operation
when 'delete'
client.delete(index: index, type: type, id: id)
end
end
关于软删除的问题,可以在软删除中添加 commit 回调,使得软删除和删除行为一致,然后就可以像上述一样当成普通删除处理了:
# app/models/concerns/soft_delete.rb
def destroy
transaction do
# 添加 destroy 回调
run_callbacks(:destroy) do
# 添加 transaction 的 commit 回调
self.class.connection.add_transaction_record(self)
# 给 commit 回调添加条件(on: :destroy)
@_trigger_destroy_callback = if persisted?
# 此处逻辑修改
time = Time.zone.now
update_columns(deleted_at: time, updated_at: time)
else
true
end
@destroyed = true
freeze
end
end
end
上述代码都是在 Rails 5.2 的环境下测试的,其他版本细节可能会有所不同
原来 article 的时候,你是都保持一致,但是换成 example 时,你还有个地方没换啊
controller 里的 '@article' 要跟 form_for 里的 ':example' 对上,参数就是从这里传过去的
技术关键字 SSO
belongs_to :parent_group, class_name: "UserGroup", optional: true
default 参数是支持块的,可以用块传动态值:
attribute :uid, :string, default: proc { Digest::MD5.hexdigest(1) }