问题集

2016-10-31 09:54:40来源:作者:全栈工程师成长记人点击

从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#indexShowing /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或者 bundle、 bundle -v都会提示

undefined method `activate_bin_path' for Gem:Module (NoMethodError)

然而却可以运行 bundler bundler -v

过程:

试着 gem uninstall bundle然后再 gem install bundle,会提示安装成功

Fetching: bundle-0.0.1.gem (100%)Successfully installed bundle-0.0.1Parsing documentation for bundle-0.0.1Installing ri documentation for bundle-0.0.1Done installing documentation for bundle after 0 seconds1 gem installed

但症状依旧。

解决:

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图模型。

端口占用的解决方法: 终端中输入 sudo lsof -iTCP -sTCP:LISTEN -P | grep :3000 输入本机密码 终端中输入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的注册页面加入验证码为例:

在app中显示devise的controller

rails g devise devise/users

其中 devise/users是scope值,可以自定义到其他位置

修改 /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 updatebrew uninstall readlinebrew install readline

没有解决

rvm cleanup allrvm autolibs enablervm 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-buildenv 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解决的。

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 了。

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台