Rails4メモ　簡易なブログを作る その１ 

Rubyのversionは<strong>ruby 2.0.0p247</strong>
Railsのversionは<strong>Rails 4.0.0</strong>を使う。
分からなかったら[RailsGuide](http://guides.rubyonrails.org/getting_started.html "RailsGuide")を見る。

データベースはMysqlを選ぶ

```
>rails new pakon(アプリの名前は好きなのでOK) -d mysql
```

ここで開発フォルダをpakonと命名。
データベースはsqliteがデフォルトなのでそれをmysqlにするにはオプションで-dをつける

```
>rails g controller articles(コントローラー名) --skip-assets

> 下記作られるファイル
      create  app/controllers/articles_controller.rb
      invoke  erb
      create    app/views/articles
      invoke  test_unit
      create    test/controllers/articles_controller_test.rb
      invoke  helper
      create    app/helpers/articles_helper.rb
      invoke    test_unit
      create      test/helpers/articles_helper_test.rb
```

--skip-assetsはjs,cssファイルをつくるのをキャンセルする意味。
必要ないので削除。
コントローラー名は複数形にするのが基本、articleではなくarticlesで、、、、
コマンド入力に失敗したならrails d controller article(コントローラー名)でコマンドを入力、削除する。
viewのファイルも自動で作られるので便利。

```
>rails g model article name:string title:string content:text

> 下記作られるファイル
　   invoke  active_record
      create    db/migrate/20130907012228_create_articles.rb
      create    app/models/article.rb
      invoke    test_unit
      create      test/models/article_test.rb
      create      test/fixtures/articles.yml
```

もし失敗したなら gのところをdにする、二番と同じ
モデル名は単数形にすること

```
> rake db:create 
> rake db:migrate
```

rake db:createはデータベースを作る、rake db:migrateはデータベースにカラムを追加したり、削除したりする時に使う。migrationの機能がある事によってMySQLでもSQliteでも同じコマンドでデータベースの変更が打てるので便利。SQliteの場合rake db:createは打たなくもOK。
ちなみにカラムはデータの種類を表すもの。
nameというカラムにstringという文字列をいれる型を設定
textは長い文字列。

サーバーを起動

```
> rails s
```

rails serverでも打てるが省略

ターミナルに下記の情報がでる
Rails 4.0.0 application starting in development on http://0.0.0.0:3000
http://0.0.0.0:3000 に接続して確認する。
<strong>Welcome aboard</strong>の文字画面とRailsのロゴが入ったページに移動したら成功。

pakon/app/controller/articles_cotroller.rbのファイルを開く。
以下のコードを追加。

```rb:articles_controller.rb

class ArticlesController < ApplicationController
  # ページに表示一覧
  def index
    @article = Article.order("created_at DESC")
  end
  # ページの詳細
  def show
    @article = Article.find(params[:id])
  end
  #　データの新規作成のオブジェクトを作る
  def new
    @article = Article.new
  end
  # データベースに新規作成のデータをセーブ
  def create
    @article = Article.new article_params
    if @article.save
      redirect_to :root
      flash.notice = "作成できました！"
    else
      render action: :new
    end
  end
  # 更新するデータを取得する
  def edit
    @article = Article.find(params[:id])
  end
  # データを更新する
  def update
    @article = Article.find(params[:id])
     if  @article.update_attributes article_params
      redirect_to :root
      flash.alert = "更新しました！"
    else
      render action: :edit
    end
  end
  # データを削除する
  def destroy
    @article = Article.find(params[:id])
   if @article.destroy
    redirect_to :root
   end
  end

  private
  def article_params
    params.require(:article).permit(
      :title,
      :name,
      :content
      )
  end

end


```

<strong>indexアクション</strong>はデータベースから作成日時が新しい順にデータをとってくる。
DESCは降順、ASCは昇順。
<strong>showアクション</strong>はparamsという命令パラメータのデータを取得する。
<strong>newアクション</strong>は新規データのオブジェクトの作る。
<strong>createアクション</strong>は新規のデータをsaveする、データベースに追加する。
<strong>editアクション</strong>は更新するデータを取得する。
<strong>updateアクション</strong>はデータを更新する。
update_attributesは複数の項目を一度に変更・保存するメソッド
<strong>deleteアクション</strong>はデータを削除する。
privateの下にあるメソッドはRails4から導入された<strong>Strong Parameters</strong>という機能。
articleモデルの中にあるtitle、name、contentのカラム指定している。
これをどれか入れ忘れるとデータがデータベースに入らないので注意。
updateのメソッドで使っている。

createメソッドとupdateメソッドにあるflashメソッドは簡単な通知を出したい時に便利。
コントローラーで定義してviewsフォルダにあるファイルに<%= flash.notice%>を書いて表示する。
views/articles/index.html.erbを参考

pakon/app/view/のフォルダの下にファイルを作る
・<strong>index.html.erb</strong>
・<strong>show.html.erb</strong>
・<strong>new.html.erb</strong>
・<strong>edit.html.erb</strong>
・<strong>_form.html.erb</strong>

html.のあとにerbつけることによってhtmlのファイルにRubyのコードを埋め込めるようになる
<strong><% %></strong> => Rubyの命令を実行する。
<strong><%= %></strong> => Rubyの命令を実行し、Htmlファイルに出力。
<strong><%# %></strong> => コメントアウト
などがある。

\_form.html.erbはファイル名の名前にアンダスコア(_)を付ける事によってviewのテンプレートに部品みたいな感じで埋め込む事ができる。共通したコードを管理する時に便利。詳細はnew.html.erb、edit.html.erb、   _form.html.erbのコードを参照。

```rb:index.html.erb
# index.html.erbを編集

<%= link_to "新規作成", new_article_path %>
  <%= flash.notice %>
  <%= flash.alert %>
<hr>
<% @article.each do |f| %>
    <ul>
      タイトル：<%= link_to f.title, article_path(f)%>
    </ul>
    <ul>
      名前：<%= f.name %>
    </ul>
    <ul><br>本文：</br>
      <%= simple_format(truncate(f.content,:length => 1000)) %>
    </ul>
    <ul>
      作成日時：<%= f.created_at.strftime("%Y/%m月%d日(#{%w(日 月 火 水 木 金 土 日)[Time.now.wday]})") %>
    </ul>
    <ul>
      <%= link_to "編集", edit_article_path(f) %>&nbsp;：&nbsp;<%= link_to "削除", f,
    :confirm => "削除してよろしいですか？",
    :method => :delete %>
    </ul>
    <hr>
<% end %>

```

<strong>simple_format</strong>はtextareaに改行付きで入力した時にp とか br をいれて HTML として表示する。
これを使うときれいに表示される。
<strong>truncate</strong>は一覧画面等に収まらない長い文字列を表示する時に便利。lengthで指定して表示する。

```rb:show.html.erb

# show.html.erbの編集

<%= link_to '記事一覧に戻る', :articles %>
<hr>
    <ul>タイトル：<%= @article.title %></ul>
    <ul><br>本文</br><%= simple_format(@article.content) %></ul>
    <ul>作成日：<%= @article.updated_at.strftime("%Y/%m月%d日(#{%w(日 月 火 水 木 金 土 日)[Time.now.wday]})") %></ul>

```

```rb:new.html.erb

#new.html.erbの編集

<%= link_to '前に戻る', :articles %>
<hr>
<%= form_for @article do |f| %>
<%= render "form", f: f %>
<p><%= f.submit %></p>
<% end %>

```

アンダースコアで(_)でファイル名を付ける事によって<strong>render</strong>という命令でファイルを読み込めるようになる。


```rb:edit.html.erb

#edit.html.erbの編集

<%= link_to '前に戻る', :articles %>
<hr>
<%= form_for @article do |f| %>
<%= render "form", f: f %>
<p><%= f.submit %></p>
<% end %>

```

```rb:_form.html.erb

#_form.html.erb 

<% if @article.errors.any? %>
  <h2>エラーが<%= (@article.errors.count) %>件あります</h2>
  <ul>
    <% @article.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
  </ul>
<% end %>

<table>
  <tr>
  <th><%= f.label :title %></th>
  <td><%= f.text_field :title, size: 50 %></td>
  </tr>
  <tr>
    <th><%= f.label :name %></th>
    <td><%= f.text_field :name, size: 50 %></td>
  </tr>
  <tr>
    <th><%= f.label :content %></th>
    <td><%= f.text_area :content, :cols => 70, :rows => 20 %></td>
  </tr>
</table>

```

pakon/app/models/article.rbのファイルを開く
以下のコードを追加

```rb:article.rb

class Article < ActiveRecord::Base
  validates :title, presence: true
  validates :name, presence: true,:length => { :maximum => 20 }
  validates :content, presence: true
end

```

モデルにバリデーションを追加する。
バリデーションはデータをsaveする時に制約をつける機能。
・Titleは必須入力
・Nameは必須入力かつ入力できる文字が２０字以内
・Contentは必須入力


初期のデータベースはなにもデータが入ってない状態なのでデータを作る
pakon/db/seeds.rbを開く

````rb:seeds.rb

class Array
    def choice
      at( rand( size ) )
    end
end

def kuman(size)
  [*0..9, *'a'..'z', *'A'..'Z'].sample(size).join
end

1.upto(50) do |abc|
  Article.create(
  { name: ['gorira', 'koara', 'pantu', 'women'].choice,
    title: [kuman(5), kuman(6), kuman(10), kuman(7)].choice,
    content: ( kuman(100) + "\n" ) * 10
    })
end

```

下記のコマンド打ってデータベースにデータを挿入

```
>rake db:seed
```

ルート設定しなきゃページが読み込まれないからルートを設定する、
ルートはページの住所みたいなもの
pakon/config/routes.rbを開く

```rb:routes.rb
Pakon::Application.routes.draw do
  root 'articles#index'
  resources :articles
end
```

root 'article#index'はサイトに接続して最初に開かれるページを設定する。
コントローラー名のあとにアクション名を書いて指定。

http://0.0.0.0:3000