• 换个思路,把这些逻辑代码抽到一个类里面,可以放在 app/services/下,然后 rake 调用这个类,controller 也可以调用这个类

  • 感谢提示,换个思路,把局部变量换成方法,问题解决了。

    l = -> { puts c }
    define_method(:c) { 3 }
    l.call
    

    ps: 通过实例变量可以绕过这个我知道,但是写起来就不太雅观~

  • 最开始用 vim,后用 rubymine(方便跳转),后回归到 neovim(解决了代码跳转的痛点,另外原生 vim 剪贴板不好用,还有各种乱七八糟原因,选择了 neovim 代替 vim)

    现在用的 neovim,代码跳转使用 ctag(方法,类跳转,甚至一些 rails 的东西也能跳转,比如 has_many,scope :xxx, -> {}),深入使用还发现支持跳转到 gem 内部,基本解决了跳转的问题,不过类型推断还是有点弱。另外一些插件比如 rails.vim 实现 controller 到 view 的互相跳转,加上 key mapping 挺香的。

    至于 ctrlp,nerdtree 什么也不说了,熟悉 vim 的应该都知道,下面贴个图,当我在 find_by! 方法上按下 ctrl + ],ctag 自动替我找到 gem 内部的 find_by! 方法

    代码补全用 YCM(现在被 TabNine 代替),如下是补全效果

  • wsl 是可以运行 windows 可执行程序的,比如 ipconfig.exe、qq.exe,甚至 windows 的程序可以结合 linux 的管道以及其他命令来使用。

    另外也不麻烦,推荐装一个 cmder,zsh,拥有比较良好的终端界面。通过设置以后,打开终端可以直接进入 wsl。

  • 三、WSL 和 RubyInstaller

    前者在虚拟机中运行,后者在本机中运行,它们的比较最终要看用途,比如在本机运行的 Ruby 可以做一些在 Windows 上的日常管理工作。

    这里我有个问题,WSL 可以运行 windows 的 exe,并且文件共享。WSL 里的 ruby,应该也可以做 Windows 上的日常管理工作。

  • 看到提供的 api,提个建议,提供更优雅的元编程方法,达到如下效果:

    class User < ActiveRecord::Base
      action_store :like, :post
      action_store :block, :user
    end
    

    使用:

    user = User.first
    post = Post.first
    user2 = User.last
    
    user.like post
    user.like? post # user.liked? post
    user.unlike post
    user.block user2
    user.block? user2 # user.blocked? user2
    user.unblock user2
    
  • Rails 微服务初探 at 2020年12月29日

    这个应该搞 monorepo,放一个 git repo 里

    即使是这样,ruby 的特性也决定了,你并不能直接跳转到调用服务的定义处,只能通过 复制 -> 搜索 -> 粘贴 -> 选择

  • Rails 微服务初探 at 2020年12月29日

    除了有网络 IO,用起来就跟普通函数调用没啥区别。java 强类型的,屏蔽底层细节之后,RPC 调用之后返回值是一个具体的对象(但是本质上是个接口,一堆 getter 方法)。

  • Rails 微服务初探 at 2020年12月29日

    一个人维护多个微服务不是问题,问题取决于生态。

    之前写 JAVA spring boot 微服务,一个大项目(按团队/业务部门)下有 N 个 module,每个 module 容器化独立部署微服务。

    module 之间通过 RPC 调用,但因为 controller 遵循接口的方式去实现。用 IDE,RPC 调用端可以直接跳转到代码的实现,进行修改。

    体验就是,跟正常的单体应用开发区别不是很大,微服务只是一种解耦的方式而已,好处就是便于维护(解耦的本质),写的也很爽。

    但是 ruby 做微服务,如果在 N 个项目跳来跳去的,简直是一种灾难。

  • 1.安装 ctag,ctrl-] 跳转到定义,ctags --recurse . `bundle show --paths` 生成索引之后,函数/类的定义可以跳转到 gem 里

  • 我也用的 vue + element,解决方式是自己构造 formData,把 object 传进去

    append(formData, obj, prefix) {
      if (Array.isArray(obj)) {
        for (const item of obj) {
          this.append(formData, item, `${prefix}[]`);
        }
      } else if (typeof obj === 'object') {
        var isObject = false
        for(var prop in obj) {
          if (obj.hasOwnProperty(prop)) {
            isObject = true
          }
        }
        if (isObject) {
          for (const key in obj) {
            var value = obj[key];
            if (value === null || value === undefined) {
              continue;
            }
            this.append(formData, value, `${prefix}[${key}]`);
          }
        } else {
          formData.append(prefix, obj);
        }
      } else {
        formData.append(prefix, obj);
      }
    },
    
    

    用的时候

    var formData = new FormData();        
    this.append(formData, this.obj, "obj");
    this.fileList.map(item => {
      if (item.status === "ready") {
        formData.append("obj[your_attach_association][]", item.raw);
      }
    });
    
  • 使用中遇到一个问题,使用了 rvm,在不同项目下会自动切换 ruby 版本。

    当进入一个其他 ruby 版本项目的时候:

    /Users/tiny/.local/share/ecdict/ecrepl:13:in `require': cannot load such file -- sqlite3 (LoadError)
            from /Users/tiny/.local/share/ecdict/ecrepl:13:in `<main>'
    
    

    现在的问题要得到解决,需要我在每个 ruby 版本的 gems 都去 bundle install 一下

    这种情况下,是不是可以通过 sh 脚本来做一些优化...

  • 搞定了,没什么特别喜欢的头像,就一直用的这个~

  • export PATH="~/.local/share/ecdict:$PATH"

    试了一下,这里要换成具体路径,比如/Users/xxx,不能用~,我是 mac

    然后这几步应该之前都执行过了,没有问题

    chmod +x ecdict.rb
    chmod +x ecrepl.rb
    mv ecdict.rb ecdict
    mv ecrepl.rb ecrepl
    
  • 重开 shell 也一样

  • puts caller
    
  • JMX,加@ManagedResource注解即可

    如果你用了 springboot,可以在 springboot admin 后台直接执行

    关于SpringBoot Admin 和 JMX

    命令行的话,有几个jmx 客户端

    ps:本地的话,还可以用 jconsole,可以对现有线程的方法进行调用

  • ActiveRecord 优化问题 at 2020年08月25日

    可以加一个字段,比如 should_delete

    然后对Tagging.where(tag_id: delete_tag_ids)做批量更新

    冲突时update should_delete = 1,然后再Tagging.where(should_delete:1).delete

  • 利用第二篇文章,做到了,非常感谢,很有用!

  • 2.try(:test1)

    2&.test1

    后者会抛出 NoMethodError

  • 我就用的 ctag,vim 下 ctrl + ] 可以跳转

  • 有一些 gem,可以生成 gem 包的 tags,但是是在 gem 目录下生成的,在项目里有没有办法能跳转到 gem 包的定义里,类似 rubymine 这样的?

    https://github.com/tpope/gem-ctags

  • 还是有区别,如果@topic.node,不能响应name方法或者出现异常的话。使用@topic.node.try(:name),是不会报错的;但是@topic.node&.name,前者不为空是会报错的。

  • 在 Git 的监视下 偷偷摸摸 at 2020年07月13日

    每次改 database.yml 、xxx.yml, 都要回来找一下这个命令 😂 git update-index --skip-worktree

  • Rails 请求 Java API 接口问题 at 2020年06月17日

    header 里是不是要加上 json 的 ContentType ?