Rails Tips


個人的なメモ書きです。


# セットアップ

## Xcodeのセットアップ

- [Mac App Store](https://itunes.apple.com/jp/app/xcode/id497799835?mt=12)からインストールする
- インストール後、いちど起動して、利用規約に同意する
  - これをやっておかないと後でエラーが出る

次に、

```bash
xcode-select --install
```


## Homebrewのセットアップ

```bash
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

- http://brew.sh/ の手順通り


## Rubyのセットアップ

```bash
$ brew update
$ brew install ruby
```


## PostgreSQLのインストール

```bash
$ brew install postgresql
```


# Railsプロジェクトの新規作成

- `fuga`という名前のプロジェクトを作成
- 自動で行われる`bundle install`をスキップする（後ほどGemfileを編集するから二度手間になる）
- DBにPostgreSQLを使用する

```bash
$ rails new fuga --skip-bundle -d postgresql
$ cd fuga
$ bundle install --path vendor/bundle --without production
```

https://gist.github.com/kskb/9337868


# DBの作成, postgisの導入などを簡単に済ませたい

簡単というかこれがrailsでやるときの標準的なやりかたなのかな。
知らずに手動でDBつくったりしてた・・・

`bundle exec rake -T db` でdbに関するrakeタスクの一覧が表示できる

```bash
$ bundle exec rake -T db
rake db:create              # Creates the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:create:all to crea...
rake db:drop                # Drops the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all...
rake db:fixtures:load       # Load fixtures into the current environment's database
rake db:gis:setup           # Setup PostGIS data in the database
rake db:migrate             # Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog)
rake db:migrate:status      # Display status of migrations
rake db:rollback            # Rolls the schema back to the previous version (specify steps w/ STEP=n)
rake db:schema:cache:clear  # Clear a db/schema_cache.dump file
rake db:schema:cache:dump   # Create a db/schema_cache.dump file
rake db:schema:dump         # Create a db/schema.rb file that is portable against any DB supported by AR
rake db:schema:load         # Load a schema.rb file into the database
rake db:seed                # Load the seed data from db/seeds.rb
rake db:setup               # Create the database, load the schema, and initialize with the seed data (use db:reset to also drop the database fi...
rake db:structure:dump      # Dump the database structure to db/structure.sql
rake db:structure:load      # Recreate the databases from the structure.sql file
rake db:version             # Retrieves the current schema version number
rake test:all:db            # Run tests quickly, but also reset db
rake test:db                # Run tests quickly, but also reset db
```

## dbの作成

```bash
rake db:create
```



# デバッグ

`byebug`を使うようになったぽい。

> Simply drop `byebug` wherever you want to start debugging and the execution will stop there.

とのこと。

https://github.com/deivid-rodriguez/byebug



# 開発環境

## ローカルでrdocを読みたい

```bash
rdoc server
open http://[::]:8808/  # せっかくなのでIPv6で
```

## `bundle exec`やめたい

普通に`rails s`とかするときにもうそんなもの必要ないよ


## ローカルで実行中の`rails server`を一時的に外部に公開したい

[ngrok](https://ngrok.com/)を使うのがよい。



# Generator

## アクションを指定してControllerを追加したい

```bash
$ rails g controller devices action1 action2
```

## 既存のテーブルにカラムを追加したい

- `devices`テーブルに`text`型の`ssh_public_key`カラムを追加する

```bash
rails g migration add_ssh_public_key_to_devices ssh_public_key:text
```


## scaffoldでリレーションをつくりたい

```bash
$ rails g scaffold Post
$ rails g scaffold Comment post:references
```

http://stackoverflow.com/questions/20368972/rails-generate-has-many-association


## ネストされたコントローラを生成する

```bash
rails g controller admin/users
```

http://stackoverflow.com/questions/15043524/how-to-generate-controller-inside-namespace-in-rails



# Controller

## リクエストヘッダを取得する

```sh
curl -v -H "ACCESS_KEY: 82b8e91f047be83c252009d08c3def88" http://localhost:3000/api/devices/980190967.json
```

というリクエストの場合、

```ruby
request.headers[:HTTP_ACCESS_KEY]
```

で取得できる。

http://xyk.hatenablog.com/entry/2015/02/01/181648


## レスポンスをJSONに限定する


```ruby
def index
  @users = User.all
  render "index", :formats => [:json], :handlers => [:jbuilder]
end
```


# Test::Unit

## テストAPIのドキュメント

- [assert_response](http://apidock.com/rails/v4.2.1/ActionDispatch/Assertions/ResponseAssertions/assert_response)



# その他

## DBをつくりなおす

`db/seeds.rb`を書いておく。

```bash
rake db:drop
rake db:create
rake db:migrate
rake db:seed
```

## `rake test`でフルスタックトレースを表示する

`config/initializers/backtrace_silencers.rb` を編集して、次の行のコメントをはずす。

```diff
-#Rails.backtrace_cleaner.remove_silencers!
+Rails.backtrace_cleaner.remove_silencers!
```


http://stackoverflow.com/questions/6908708/how-to-show-longer-traces-in-rails-testcases

## 任意のURLを組み立てる

```ruby
# httpからはじまるURLの場合
URI::HTTP.build(:host => "www.google.com", :query => { :q => "test" }.to_query)
# pathだけの場合
URI::Generic.build(:path => '/auth/github', :query => { :origin => new_app_path }.to_query)
```

http://stackoverflow.com/questions/6152231/is-there-a-ruby-library-gem-that-will-generate-a-url-based-on-a-set-of-parameter


## devise gemを使うときの注意

test helperを追加しておかないと、functional testで`NoMethodError: undefined method `id' for nil:NilClass`というエラーが出る。

http://stackoverflow.com/questions/31657430/nomethoderror-undefined-method-user-for-nilnilclass
https://github.com/plataformatec/devise#test-helpers

## rails runner でURLヘルパーを使う

```shell-session
$ rails runner "helper = ApplicationController.helpers; helper.class_eval { include Rails.application.routes.url_helpers }; p helper.quotes_path"            
"/quotes"
```

参考: https://coderwall.com/p/s5sjqq/accessing-view-helpers-in-a-rails-runner-session

# 資料

* [Rails Webook](http://ruby-rails.hatenadiary.com/)
  * 日本語のとても豊富な情報