全栈工程师成长记

编程重新定义人生

问题集

从7月开始学 rails 到现在陆陆续续遇到了各种各样的 bug 和问题,大部分已经发在博客上,有一些则是根本就没有记录的,还剩下的则是七零八落的丢在电脑里的各个位置,今天整理一下全部丢上来。


simple_form 栏位相关

注册页面提示:No input found for citext
原因:username 栏位的数据类型是 t.citext "username"
解法:为simpleform相关栏位加入 as: :string

-        <%= f.input :username, required: true, label:false,  :placeholder => "用户名"%>
+        <%= f.input :username, required: true, label:false,  :placeholder => "用户名", as: :string %>

加载 layout js \ css

错误提示:

Sprockets::Rails::Helper::AssetNotPrecompiled in Welcome#index

Showing /app/views/layouts/welcome.html.erb where line #9 raised:


Asset was not declared to be precompiled in production.
Add `Rails.application.config.assets.precompile += %w( welcome.css )` to `config/initializers/assets.rb` and restart your server

解法:按照报错提示给 config/initializers/assets.rb 加入相关的 css 和 js 文件名就可以了


pg 数据库相关

问:post 属于某个 group ,要将几个 group 下面的 post 全部导出。
答:SELECT * FROM public.posts WHERE group_id = 5 OR group_id = 6 OR group_id = 7


重命名heroku app

heroku apps:rename new-app-name


rake 相关

为文件添加 # TODO, # FIXME, # OPTIMIZE
运行 rake notes 就可以查看待办事项
rake notes:custom ANNOTATION=ZOMG
rake notes:todo


git 相关

查看 git 配置:
git config --list

通过编辑器修改配置:
atom ~/.gitconfig

查看 git 已经追踪的文件:
git ls-files


bundle 相关

问题:运行 bundle install 或者 bundlebundle -v 都会提示
undefined method activate_bin_path for Gem:Module (NoMethodError)

然而却可以运行 bundler bundler -v

过程:试着 gem uninstall bundle 然后再 gem install bundle ,会提示安装成功,但症状依旧。

解决:google 到这个结果,按照最后一个答案

For me, (I am working with RVM) it worked just running:

gem update --system
gem update bundler

运行 gem update --system 就可以解决了,不需要后面一步。


用 navicat 导出 ER 图

google navicat 导出表结构
这个结果说的是导出SQL文件,不符合预期

google navicat 导出表结构图片
结果不理想

google navicat 结构图片
第一个结果是《用Navicat制作ER图及与SQL互相转化》,答案在里面:

将现成的数据库转换为ER图
选中已连接的数据库中 数据表——右键,选择“逆向数据库到模型”,即可根据现成的数据库生成ER图模型。


端口占用的解决方法:

  1. 终端中输入 sudo lsof -iTCP -sTCP:LISTEN -P | grep :3000
  2. 输入本机密码
  3. 终端中输入ruby后面的号码,假设是是16705,则: kill -9 16705

rake db 错误的解决办法

运行rake db:migrate 提示:

== 20160928075454 Users: migrating ============================================
-- add_column(:users, :user_name, :string)
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: no such table: users: ALTER TABLE "users" ADD "user_name" varchar

解决: rake db:schema:load


rails console 无法新增记录

输入Group.create(title: "Board 1", description: "Board 1 body"),提示

   (0.1ms)  begin transaction
   (0.1ms)  rollback transaction
 => #<Group id: nil, title: "Board 1", description: "Board 1 body", created_at: nil, updated_at: nil, user_id: nil>

 

原因在于 model 里将 user 和 group 的关系关联了起来,所以需要给 group 指定 user id 即可(当然前提是数据库里要存在这个 user ,不然也还是会报错)。

重新输入Group.create(title: "Board 1", description: "Board 1 body", user_id:"1")


Rails 相关笔记集合

  • rails c 只能在当前档案打开,是档案的后门

  • irb 可以在任何环境打开

  • git add . 尽量不要使用,只add想要的文件

  • git服务器可以自架,除了github,还有很多的git服务商

  • Rails最大的特点是有很多Gem套件

  • rubygems.org统一控制版本代码。

  • 比如 A 引用 B 的1.0,C 引用 B 的2.0 ,bundle 负责 gem 之间的相依性,放在 gemfile.lock里面,commit 的时候要把 gemfile.lock 也加入,远端服务器才能记录引用。

  • 密码不要上传到到GitHub,不要上传 config / database.yml ,为了保持目录结构,可以拷贝一份空的 databasy.sample.yml

  • 除了 .html.erb ,还有 .css.erb 之类的问件,它们可以混合使用 ruby 语法。

  • google rails validate,有很多的API

  • rake routes里面,:format可以生出不同的格式,比如.css .jason

  • ID可以自定义

  • collection 是一群,一群东西就不会有 id

  • member 是单个,就会有 id


如何自定义 Devise 的 controller

以修改devise的注册页面加入验证码为例:

  1. 在app中显示devise的controller
    rails g devise devise/users
    其中devise/users是scope值,可以自定义到其他位置

  2. 修改/app/controllers/devise/users/registrations_controller.rb

   def new
     super
   end

  def create
    if verify_rucaptcha?(params[:_rucaptcha])
      super
    else
      flash[:alert] = "验证码错误"
      redirect_to :back
    end
  end

这里面的if verify_rucaptcha?(params[:_rucaptcha])
是我们主要想要自定义的部分。
super是 devise 自己的方法。

3.修改/config/routes.rb

Rails.application.routes.draw do
  devise_for :users, :controllers => {:registrations => "devise/users/registrations"}

   略...
end

这里面的devise/users/registrations就是具体的要自定义的controller位置。


ruby 新语法

%i 是Ruby 2.0之后对Array 的一种简便写法,array 里面不同symbol用空格space隔开,
如%i(new create edit)

参考:http://ruby.zigzo.com/2014/08/21/rubys-notation/

%q[ ] # Non-interpolated String (except for \\ \[ and \])

%Q[ ] # Interpolated String (default)

%r[ ] # Interpolated Regexp (flags can appear after the closing delimiter)

%i[ ] # Non-interpolated Array of symbols, separated by whitespace

%I[ ] # Interpolated Array of symbols, separated by whitespace

%w[ ] # Non-interpolated Array of words, separated by whitespace

%W[ ] # Interpolated Array of words, separated by whitespace

%x[ ] # Interpolated shell command

修复 rails c 运行时提示 Reason: image not found readline.bundle

描述:运行 rails c ,提示Reason: image not found readline.bundle

判断:某个 app 的 gemfile 里面有安装 rb-readline 这个 gem ,不知道会不会有关系?但如果为了解决这个问题给所有的 rails 项目安装 rb-readline 显然是不合理的(其实应该先验证一下是不是会这样),毕竟人家原本没有这个 gem 是可以正常运行 rails c 的。

搜索:
google Reason: image not found readline.bundle
第一个结果没打开,我猜是因为看到搜索结果下面的日期是2012年9月25日。事后在回顾过程的时候发现里面说brew link readline --force就可以了。
打开第二个结果,里面有一个回答提供了两种解决方案:


brew update
brew uninstall readline
brew install readline

没有解决


rvm cleanup all
rvm autolibs enable
rvm install 2.1.0

还是没有解决
这时看到 rails 的 github 上有一个issues ,里面的错误跟自己的报错是一样的,解答如下。

works for me:
ln -s /usr/local/opt/readline/lib/libreadline.7.0.dylib /usr/local/opt/readline/lib/libreadline.6.dylib

这个是两行代码的意思吗?
第一行 ln -s /usr/local/opt/readline/lib/libreadline.7.0.dylib 能够运行,可第二行/usr/local/opt/readline/lib/libreadline.6.dylib感觉不太对,所以改成了ln -s /usr/local/opt/readline/lib/libreadline.6.dylib还是不对
(后来在使用 powder 的时候才知道 ln -s 是创建软连接的命令)
所以又回到之前 google 的第二个结果,里面的最高按照里面点赞最高的回答:


brew install readline ruby-build
env CONFIGURE_OPTS=--with-readline-dir=`brew --prefix readline` rbenv install 1.9.3-p286

这里面第一行可以用,
第二行的rbenv install 1.9.3-p286我改成brew install 2.3.1p112,即:

env CONFIGURE_OPTS=--with-readline-dir=`brew --prefix readline` brew install 2.3.1p112

因为我用 brew 而不是 rbenv 管理 ruby ,另外我的 ruby 版本是 2.3.1p112 ,现在回想参考的时候忘了加一个横杠,即2.3.1-p112。总当时这行命令没有起作用,然后又去掉了 p112 后缀,
改成:

env CONFIGURE_OPTS=--with-readline-dir=`brew --prefix readline` brew install 2.3.1

但还是不行。然后我就想,rails c 不可以运行,那 irb 可以运行吗?
试着运行了 irb ,能进入命令行,只是会提示:

Readline was unable to be required, if you need completion or history install readline then reinstall the ruby.

所以又试着去搜索上面的这个提示,按着某个答案的步骤走:
rvm pkg install readline
rvm reinstall all --force
在 reinstall 的最后会提示Unknown ruby interpreter version (do not know how to handle): .all。不过这个时候已经能正常进入 rials c 了。应该是rvm reinstall all解决的。

2016.11.1更新:后来有同学出现同样的问题,是用上文提到的ln -s /usr/local/opt/readline/lib/libreadline.7.0.dylib /usr/local/opt/readline/lib/libreadline.6.dylib解决的。记住,这个是一行命令而不是两行……


bundle 的时候提示 git protocol

运行 bundle config git.allow_insecure true 即可


bundle 的时候提示 Failed to build gem native extension.

运行 gem install capybara-webkit -v '1.11.1' 即可


安装 capybara-webkit 的时候提示 qmake: command not found

运行 brew install qt ,安装 Qt
安装完成之后重新运行 gem install capybara-webkit -v '1.11.1' 就能正常安装 gem 了,然后再 bundle install


bin/test 提示 gem 版本需要更新

运行 bundle update


在 atom 里使用 command + p 快速打开文件时一直显示 Indexing project (0)。

在其他项目,可以使用 command + p ,说明 atom 本身设置没问题。
退出 atom ,重新运行并打开 rails 项目,就可以正常使用 command + p 了。