Railsでアプリ作るときに、何回もおんなじこと調べてる気がするので、まとめる。


```ruby:version
ruby: '1.9.2'
rails: '3.2.3'
```

## heroku

```bash:
$ heroku create app-name --stack cedar
```

```ruby:Gemfile
group :production do
  gem 'pg'
  gem 'thin'
end
```

でgem追加。

```bash:
bundle
```

```:Procfile
web: bundle exec thin start -p $PORT
```

をアプリのrootフォルダに追加。

```ruby:config/environments/production.rb
# config.assets.compile = false を
config.assets.compile = true
```

## Bootstrapを使う
```ruby:Gemfile
gem 'twitter-bootstrap-rails'
```

```bash:
$ bundle
$ rails g bootstrap:install
$ rails g bootstrap:layout application fixed # fixed layoutの場合
```

設定を反映するためにサーバの再起動をする

## パスワードにbcrypt-rubyを使って、サインインしたユーザだけが見れるようにする

まずはUser modelを作る

```bash:
$ rails g model User account:string password_digest:string
$ rake db:migrate
```

password_digestの方は変更したらだめ。

```ruby:models/user.rb
has_secure_password

attr_accessible :password, :password_confirmation
```

を追加。

フォーム作ってもいいけど、ちょっと話ずれるので、consoleで話済ませます。

```bash:
$ rails c
```

```irb:
> User.create!(:account => "shimojik", :password => "kenta", :password_confirmation => "kenta")
```

セッションコントローラの作成

```bash:
$ rails g controller sessions
```

ルーティング

```ruby:config/routes.rb
resources :sessions
```

コントローラ

```ruby:controller/session_controller.rb
def index
  render "new"
end

def create
  user = User.find_by_account(params[:account])
  if user && user.authenticate(params[:password])
    session[:user_id] = user.id
    redirect_to root_path
  else
    flash.now.alert = "Invalid"
    render "new"
  end
end

def destroy
  session[:user_id] = nil
  redirect_to root_path
end
```

サインイン用フォーム

```erb:views/sessions/new.html.erb
<%= form_tag sessions_path do %>
  <div class="field">
    <%= label_tag :account, "アカウント" %>
    <%= text_field_tag :account, params[:account] %>
  </div>
  <div class="field">
    <%= label_tag :password, "パスワード" %>
    <%= password_field_tag :password, params[:password] %>
  </div>
  <div class="actions">
    <%= submit_tag "ログイン" %>
  </div>
<% end %>
````

current_userメソッドの追加

```ruby:controllers/application_controller.rb

helper_method :current_user

private
  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
```

ルーティング追加

```ruby:config/routes.rb
match "/signin" => "sessions#new", :as => :signin
match "/signout" => "sessions#destroy", :as => :signout
```

```ruby:
def authorize
  if session[:user_id]
    @current_user = User.find(session[:user_id])
    session.delete(:user_id) unless @current_user
  end
end
```


## 名前空間を使う（管理者ページなど）

```config/routes.rb
namespace :admin do
  # ルーティング
end
```

```bash:
$ mkdir app/controllers/admin
```

adminにおけるスーパークラスを作る

```ruby:controllers/admin/base.rb
class Admin::Base < ApplicationController
  # before_filter などはここに入れるといい
end
```

コントローラgenerate

```bash:
$ rails g controller admin/home --skip-assets
```

ApplicationControllerじゃなくて、Admin::Baseをスーパークラスに設定

```ruby:controllers/admin/home_controllers.rb
class Admin::HomeController < Admin::Base
  def index
  end
end
```

viewsはapp/views/adminフォルダの中に書いていけばいい。
（今回の場合はapp/views/admin/home/index.html.erbなど）

adminのページかどうかはコントローラで判断

```ruby:
controller.kind_of?(Admin::Base)
```


## 特定のコントローラやアクションに特定のレイアウトを適応

```ruby:samples_controller.rb
layout 'admin' # このcontroller全体

def index
  render(:layout => "check") # このactionのみ
end
```



## herokuでmail送信

```bash:
$ heroku addons:add sendgrid:starter
```

```ruby:config/initializers/mail.rb
ActionMailer::Base.smtp_settings = {
  :address        => 'smtp.sendgrid.net',
  :port           => '587',
  :authentication => :plain,
  :user_name      => ENV['SENDGRID_USERNAME'],
  :password       => ENV['SENDGRID_PASSWORD'],
  :domain         => 'heroku.com'
}
ActionMailer::Base.delivery_method = :smtp
```

## Mailer

Mailerをgenerate

```bash:
$ rails g mailer NoticeMailer sendmail
```

```ruby:mailers/send_mailer.rb
default :from => 'shimojik@example.com'
def sendmail(user)
  @user = user
  mail to: :user.email, subject: "タイトル"
end
```

```ruby:app/views/notice_mailer/sendmail.text.erb
# erb形式で内容を書く。
# mailers/sendmail.rbに書いたインスタンス変数は使える
```

あとは、アクションに追加。

```ruby:controllers/some_controller.rb
def add_user
  user = User.find(params[:id])
  @mail = NoticeMailer.sendmail(user).deliver
  render text: "メールを送信しました"
end
```

他にもいろいろ在るので、追加していきます。みなさんのも教えて下さい:)