Rails 新手采坑记录

不带括号的方法调用之殇 在Rails integration test里面执行post请求: post room_messages_path target_room, message: {body: 'hello'}, token: 'user_token', format: :turbo_stream 你以为后面的message: {body: 'hello'}, token: 'user_token', format: :turbo_stream都是post的参数?room_messages_path的参数只是target_room? 其实错了!target_room, message: {body: 'hello'}, token: 'user_token', format: :turbo_stream都是room_messages_path的参数,post的参数只有一个,就是那个path:room_messages_path(target_room, message:…

Continue ReadingRails 新手采坑记录

PostgreSQL在Mac上无法启动的问题解决

今天启动我一个Rails App的时候遇到错误: connection to server at "::1", port 5432 failed: Connection refused Is the server running on that host and accepting TCP/IP connections? 看来是psql没有运行起来,或者是被谁shutdown了,执行 postgres -D /usr/local/var/postgres 出现以下提示 2022-02-11 20:29:45.999…

Continue ReadingPostgreSQL在Mac上无法启动的问题解决

RVM遇到的两个问题

今天在自己电脑用rvm安装ruby 3.1.0,但是在 rvm get master的时候,报了一个错: Error running 'command gem install /Users/chris/.rvm/gem-cache/gem-wrappers-1.4.0.gem --local --no-ri --no-rdoc' 没有找到解决办法,于是使用rvm implode全部卸载了rvm,然后再重新安装。 但是在重新安装的时候,按照官网的说明,使用gpg add key的时候,有报错了: $ gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB gpg: keyserver receive failed:…

Continue ReadingRVM遇到的两个问题

我愿称之为The Art of Reading Error Messages

最近把打卡团服务器从Rails6升级到了Rails 7。其中一个改动是,将webpacker改成esbuild。改动本身其实并不难,将jsbunding-rails和 cssbundling-rails 两个gem加到Gemfile里面。 然后执行各自的install task,照着网上的一些教程基本上就能搞定,这里不作详细的赘述。 在这个过程中,因为某个依赖不支持Node 15,于是升级到了node 16。但是在部署的时候,遇到一个问题,报了一个错: In file included from /home/username/.cache/node-gyp/16.13.2/include/node/v8.h:30:0, from /home/username/.cache/node-gyp/16.13.2/include/node/node.h:63, from ../../nan/nan.h:58, from ../src/binding.cpp:1: /home/username/.cache/node-gyp/16.13.2/include/node/v8-internal.h: In function ‘void v8::internal::PerformCastCheck(T*)’: /home/username/.cache/node-gyp/16.13.2/include/node/v8-internal.h:492:38: error: ‘remove_cv_t’ is not…

Continue Reading我愿称之为The Art of Reading Error Messages

Apple Watch App开发初体验

前天买了一个apple watch 7,昨天想着做一个简单的app,来记录一下自己平时的投篮命中率。 最终的成品很简单,如下图所示,下方两个按钮,上方一个数字。左边的按钮表示投丢的数字,点击一下会+1,右边的表示投中的数量,同样的点击一下会+1。上方的数字是总共的投篮数,即下方两个数字之和,长按这个View,将会重置所有计数。 现在这个年代,要开发苹果相关app,当然是选用Swift + SwiftUI。这两个之前都没有接触过。于是在Youtube上面搜了一个教程,https://www.youtube.com/watch?v=F2ojC6TNwws ,由于Swift和Kotlin及其的相似,而SwiftUI和Jetpack Compose(which 我之前略有了解)也极其的相似,所以上面的教程理解起来几乎没有难度。用两倍速看完,也没花多久,一个多小时。 看完以后就开始着手开发。由于app极其简陋,开发也很快,折腾一下差不多半个小时就写完了。Xcode在开发SwiftUI方面有一个对新手非常友好的功能,是右边的Attribute Inspector面板。把鼠标定位到代码里面的某一个控件(如Button),这个面板就可以显示这个控件相关属性,并且还能在上面直接修改。最绝的是,修改完了以后,会自动的把相关的代码自动生成,加到相应的地方!这简直太奇妙了! 可以想象的是,刚开始的时候,你想实现某一个效果,但是不知道相应的代码怎么写,就可以在上面去做各种尝试。当然等你熟悉了以后,应该大部分时间还是会直接通过写代码来实现各种常用的效果。 写完了以后,先尝试在模拟器运行,这些都没有问题。但是怎么样运行到我自己买的手表上面呢?在这个步骤上,我遇到一些问题。 首先当然是google,然后找到这个帖子Install independent watchOS app | Apple Developer Forums,说要用充电线把手表跟电脑相连,我当时就有点好奇,watch的这根充电线是接触式的,并没有什么地方可以插到手表里面。这样也能“debug”吗? 带着怀疑我还是试了一下,唉?没有任何反应,手表上只是现实正在充电,没有任何app开发调试相关的页面出来。而Xcode上面选择device的列表里面也没显示这个手表的选项。我带着疑惑有google了几个页面,才发现是要把跟手表配对的”手机“连接上电脑。。。。 我当时就一口老血吐了出来!再回去看上面的帖子,人家说的也是“Connect your iPhone to your computer…” 好吧。。。…

Continue ReadingApple Watch App开发初体验

Rails 使用Redis作缓存

本文介绍使用Redis作为Rails缓存的backend的步骤。虽然简单,但是自己也遇到一些坑,因而记录一下。 安装和启动Redis 安装 mac: brew install redis Ubuntu: sudo apt update && sudo apt install -y redis-server 启动: Mac: brew services start redis Ubuntu: sudo systemctl start redis-server 我在Ubuntu下面启动Redis的时候,遇到一个错误: can't…

Continue ReadingRails 使用Redis作缓存

BitBar使用Ruby脚本,解决无法使用Gem的问题,以及读写文件路径存在空格的问题

BitBar(现改名为xbar)是一个开源的Mac小工具,它可以把任何东西放到MacOS的状态栏上面,我现在一般用它来做TODO list。如下图所示 不过,刚开始使用的时候,遇到这个一个问题,就是无法使用gem,因为BitBar默认使用的ruby版本是系统版本,而我通常使用rvm。翻了BitBar的github issues之后,找到这样一个解决办法: #!/usr/bin/env ruby unless ENV['USING_RVM'] # Re-run this script with RVM's default Ruby, after setting up the RVM path, # and setting USING_RVM to true, so that…

Continue ReadingBitBar使用Ruby脚本,解决无法使用Gem的问题,以及读写文件路径存在空格的问题

GeekWeibo升级到 Rails 6.1

时隔一年半,期待已久的Rails 6.1 终于发布了。趁着双休,给 GeekWeibo 从Rails6.0 升级到了6.1。 升级主要有三步。 一、升级Gemfile里面各个gem的版本 为了避免一些gem版本的不兼容,我先本地gem install rails把系统的rails版本升级到6.1。然后使用 rails new demo61 创建了一个新app叫demo61。接着对比 demo61/Gemfile 和 geekweibo/Gemfile 里面各个gem的版本号,相应的升级一下版本号。主要diff如下: 然后执行 bundle update。 二、执行 rails app:update 前几天才知道原来还有 rails app:update这个命令,用于app升级。执行一下,按照提示,相应的覆盖或忽略一些文件更新。执行完了之后,很多bin文件和config文件都更新了。同时会生成两个新的active_storage的migration file。一个是给 active_storage_blobs…

Continue ReadingGeekWeibo升级到 Rails 6.1

使用Vue前端、Rails后端实现图片上传的功能

这两周给自己的开源项目极客微博加上了发微博带图片的功能(作为一个“微博”app,怎么能没有发图片微博的功能呢?)。没想到,做这个小功能的折腾程度,超出了我的预期。 其实如果是纯Rails MVC,那么给微博加上图片功能,简直不要太简单。后端两行核心代码: # tweet.rb has_many_attached :images ​ # tweet_controller.rb params.require(:tweet).permit(:body, images: []) 然后前端相关的template 文件里面,相应的加上文件选择控件,和显示图片的相关代码就搞定了,毕竟ActiveStorage什么都帮你做好了。 可是极客微博前端用了Vue。发微博的时候,是通过前端发POST Ajax请求的方式发的,所以事情就变得复杂了。首先,你没有办法像文本字段一样,给json body加一个file字段,然后POST给后端。所以想要在前端用Ajax发请求上传图片,就剩下两种办法: 在前端先把图片上传到图片存储服务(我用的是阿里云OSS),拿到上传后的图片url,然后把url传给后端。 使用FormData。这是经过一些搜索,以及在微信群里面请教后,得到的方案。 我不是特别想使用第一种方式,原因有多个。其一,这种方式的实现成本不小,这个可以在Rails ActiveStorage的官方文档里面了解到。其二,这种方式的用户体验也不是很好,因为上传需要一个过程,如果上传的图片比较大的话,用户等待的时间就会有点长。先压缩再上传?那又增加了一点工作量。最后,如果用户想换一张图片的话,那之前的上传和等待就都浪费了。出于这几点考虑,我决定使用第二种方式。 但是使用FormData,其实就相当于使用表单提交的方式发请求。出于安全考虑,为了防止CSRF攻击,Rails默认需要验证表单提交的请求的CSRF token。在使用 form_for, form_with这些rails view helper构造表单的时候,rails会自动生成csrf tag field,然后在表单提交的时候,自动带上这个field。然而现在,我们的表单是自己构造的(记住这里,后面要考),不是使用Rails的view…

Continue Reading使用Vue前端、Rails后端实现图片上传的功能