Ruby On RailsでWebアプリ作成

```
自分なりのまとめです。
参考にしていただければ幸いですが、参考にして不具合等が起きた場合、保障はできませんのであしからず。
間違い等あればご教授いただけると助かります。
```

# 下準備
## 開発環境作成
### ・Railsのインストール
 Windows :
　１．[RailsInstaller/en](http://railsinstaller.org/en)からセットをインスト
　　　または、[RailsInstaller](http://rubyinstaller.org/downloads/)から「RubyInstaller」と「DEVELOPMENT KIT」をそれぞれインスト
　　　※下の方は手間がかかります。が、rubyのバージョンをプロジェクト毎に変えたい時などは
　　　　便利なのかもしれませんね。(環境変数変えるだけなはずなので)
　２．Gitが入っていなければインスト
　３．Node.jsが入っていなければインスト（恐らく）
　
 Ubuntu :
  １．Gitが入っていなければインスト
　　　`apt-get install git`
　２．Ubuntuには元々Rubyの1.9.3がインストされていて、今のままだと
　　　新しいバージョンをインストしても古いRubyが動いちゃうので、
　　　OS起動時に新しい方のRubyが使用されるように設定
　　　…と、手順がいくつかあるのでこちらの [サイト様](http://dev.classmethod.jp/server-side/language/build-ruby-environment-by-rbenv/) を参考にお願いします。

　３．後々必要になるパッケージをインスト
　・sqlite
　　`yum install sqlite-devel' or 'apt-get install libsqlite3-dev`
　・node.js
　　`yum install nodejs` or `apt-get install nodejs`

### ・Sublime Text3にプラグイン追加
　**SublimeCodeIntel** : クラスやメソッドなどの入力補完をしてくれる。


### Ruby学習サイト
　私はRuby初心者なので[Codecademy](http://www.codecademy.com/learn)で学習しました。
　今現在70%の進み具合ですが、後は習うより慣れろだとも思うのでRailsに入っちゃいます。

# シンプルなWEBアプリ作成
参考サイト様:[小学生でもわかるRuby on Rails入門](http://openbook4.me/projects/92)

## Railsのベースファイルを作成
`rails new sampleProject`
コマンドを打った場所にsampleProjectというディレクトリが作成され、その中にベースとなるファイル群が作成されました。

## ビューとコントローラの追加
### コマンドから追加
cmd(私はGitBush)から下記のコマンドを打つ。
`rails g controller users index show`
参考サイト様と同様にusersというコントローラとindex,showというビューを作成しました。
いくつかのファイルが出来ましたね。

```
DL is deprecated, please use Fiddle
      create  app/controllers/users_controller.rb
       route  get "users/show"
       route  get "users/index"
      invoke  erb
      create    app/views/users
      create    app/views/users/index.html.erb
      create    app/views/users/show.html.erb
      invoke  test_unit
      create    test/controllers/users_controller_test.rb
      invoke  helper
      create    app/helpers/users_helper.rb
      invoke    test_unit
      create      test/helpers/users_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/users.js.coffee
      invoke    scss
      create      app/assets/stylesheets/users.css.scss
```

※ここで以下のエラーが発生(2015/7/27 追記)

```
    Sorry, you can't use byebug without Readline. To solve this, you need to
    rebuild Ruby with Readline support. If using Ubuntu, try `sudo apt-get
    install libreadline-dev` and then reinstall your Ruby.
```

Gemファイルに以下の一行を追記して `bundle install` でおｋ。

```
gem 'rb-readline'
```

参考サイト：[CentOSにruby on railsをインストールする](http://ogatism.jp/techs/centos_rails_install/)


### 作成したページを確認
ページが出来ているかどうかを確認する為に、下記のコマンドでサーバーを立ち上げる。
`rails server`
rails sでも可。この状態でウェブブラウザから `http://0.0.0.0:3000/users/index` にアクセス！

　Windows:
　　繋がりませんでした。cmdじゃエラーは吐かれてない。
　　[ここ](http://www.oiax.jp/rails/zakkan/rails_3_1_installation_on_windows.html)のサイト様で原因？が見つかりました！

　　`ipconfig`と打って、ローカルエリア接続セクションのIP Address・・・が無かったので、ネットワーク接続のIPv4アドレスを使って、ここの部分を書き換えてアクセス！
　　`http://ここ:3000/users/index`
　　無事繋がりました^^

　　というか`http://localhost:3000/users/index`でいけました。

　Ubuntu:
　　何の問題もなく繋がりました。

## データベース（SQLite）
### DBの作成
下記コマンドを打ち込むだけ。
`rake db:create`

### テーブルの作成

rails g model [テーブル名] [フィールド名:型]

```lang:例

rails g model user name:string username:string location:string about:text
```
※ id:INTEGER,create_at:DATETIME,update_at:DATETIME　は自動で作成されます。

db/migrate の下を確認すると、先ほどのコマンドで生成されたテーブル作成のSQLファイルがあります。それを下記のコマンドで実行。
`rake db:migrate`
※この時に、フィールドの修正をしたくなったら、生成されたファイルを修正し、
　`rake db:migrate:reset`で始めから作成しなおしできます。オプションでファイルの指定もできるそうです。
　参考：[rake db:migrate](http://railsdoc.com/references/rake%20db:migrate)
### 初期データの反映

変数 = モデル名.new
変数.フィールド名 = "データ"
変数.save
の形で初期データをセットするseeds.rbに記述。

``` lang:db/seeds.rb

@user = User.new
@user.name = 'Ryo Suzuki'
@user.username = 'ryooopan'
@user.location = 'Kanagawa, Japan'
@user.about = 'Hello, I am Ryo. I am from database!'
@user.save

@user = User.new
@user.name = 'Shohei Aoki'
@user.username = 'moyahima'
@user.location = 'Tottori, Japan'
@user.about = 'Nice to meet you. I am from database!'
@user.save

```

コマンドで実行
`rake db:seed`
※何度も流すと同じデータがどんどん作成されるから注意！



## データの受け渡し
### ControllerからView

```lang:users_controller.rb
class UsersController < ApplicationController
  def index
    # 追記ここから---▽
　　 @user = Hash.new
　　 @user[:name] = "Sato Taro"
    # 追記ここまで---△
  end

  def show
  end
end

```

```lang:index.html.erb

<h1><%= @user[:name] %></h1>

```

### URLパラメータからController

```lang:routes.rb

SampleProject::Application.routes.draw do
  get "users/index"
  # 追記ここから---▽
  get "users/show/:username" => "users#show"
  # 追記ここまで---△


end

```

```lang:users_controller.rb
class UsersController < ApplicationController
  def index
　　 @user = Hash.new
　　 @user[:name] = "Sato Taro"
  end

  def show
    # 追記ここから---▽
    @user = Hash.new
    @user[:name] = params[:username]
    # 追記ここまで---△
  end
end

```

URLのパラメータはroutes.rbでシンボル名と遷移先を指定しておけば、
コントローラ側でparamsから値を取得できる。

### DBからデータを取得

検索条件がある場合はfind_byを使ってデータ取得。
単純にIDのみの検索の場合はUser.find(1)でOK.

```lang:controller

# Userの中でusernameが"ryooopan"のデータ
@user = User.find_by(:username => 'ryooopan')

```

## データの登録

### 登録画面の作成

``` lang:new.html.erb

<%= form_for Tweet.new do |f| %> # Form開始タグ
　# f.タグ種類 : タグ名称
  <%= f.label :title %> 
  <%= f.text_field :title %>
  <%= f.label :content %>
  <%= f.text_area :content %>
  <%= f.submit %>
<% end %> # Form終了タグ

```

```lang:routes.rb
  get "tweets/index"
  get "tweets/show"
  get "tweets/new"
  post "tweets" => "tweets#create" # 追記

```

```lang:tweets_controller.rb

class TweetsController < ApplicationController
…
  def create
    # 保存処理
    @tweet = Tweet.new
    @tweet.title = params[:tweet][:title]
    @tweet.content = params[:tweet][:content]
    @tweet.save
    # 一覧画面に遷移
    redirect_to '/tweets/index'
  end

end

```

保存処理の書き方はdb/seed.rbと同じですね。

## その他(個人的なメモ程度なものです)

### リダイレクト

controller内の場合
`redirect_to '/tweets/index'` 

### レンダリング

controller内の場合(同一コントローラのindexを読む場合)
`render :index`
controller内の場合(テキスト表示をさせたい場合)
`render :text => 'Hello!!'`

view内の場合(読ませるファイルの名前の先頭にはアンダーバーを付けること)
<%= render xxx_form %>

## Vagrantを使っている方へ注意点
　ホストPCとの共有フォルダ上で開発する場合、`bundle install`はインストール先を共有フォルダ外に指定する必要がある場合があります。
　　　通常の`bundle install`でgemのインストールがきちんとできない場合は`bundle install --path /usr/local/src/hoge`とすることをお勧めします。