Udemyのコース「【作りながら覚える！】 Ruby on Rails を用いたウェブ開発(Airbnbを作ろう！) 」を学ぶ。part 4-1〜6

Udemyの[こちらのコース](https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwjBu4a35bfXAhXQ16QKHfxQCvIQFggyMAE&url=https%3A%2F%2Fwww.udemy.com%2Fruby-on-rails-g%2F&usg=AOvVaw2zf_7hwBdtTsJHjjVy_0-6)を受けながら、疑問に思ったこと、調べた結果、大事なことをまとめていきます。

#part4-1 リスティングモデルの作成

    rails g model Listing home_type:string pet_type:string pet_size:string breeding_years:integer address:string listing_title:string listing_content:text price_pernight:integer active:boolean user:references

rails g model はテーブルを新たに作成する。
rails g migration は今あるテーブルにカラムを追加する感じ。

最後に書いた　user:references　のおかげでuser_idカラムも追加されている。他のテーブルとの結びつけだ。

これを行うとlisting.rbができ、中身はこんなん。userに所属しているって書いてある。これはuser:referencesを書いたから。
 
    class Listing < ApplicationRecord
      belongs_to :user
    end

##userとlistingの関係。
userは複数のlistingを持てる。なので、

    hasmany :listings

をuser.rbに追記。モデルね。

##必須項目の設定

      validates :home_type, presence:true
モデルファイルに書くことで必須にできる。

#自己課題
- 上記のlistingモデルの作成
- validateの設定

#part4-2-1 リスティングコントローラーの作成1

    rails g controller Listings index show new create edit update

resource :listings
とすると、routesを自動生成してくれる。

resources :pages
#     pages GET    /pages(.:format)          pages#index
#           POST   /pages(.:format)          pages#create
#  new_page GET    /pages/new(.:format)      pages#new
# edit_page GET    /pages/:id/edit(.:format) pages#edit
#      page GET    /pages/:id(.:format)      pages#show
#           PUT    /pages/:id(.:format)      pages#update
#           DELETE /pages/:id(.:format)      pages#destroy

##ログインしていないと、シッターになれないようにする。

listingコントローラーに
    before_action :authenticate_user!

と書くと、ログインしていないと次に行けなくなります。

#自己課題
- リスティングコントローラーの作成
-navbarにシッターになるを追加。（ログインしているとき。）

#part4-2-2 リスティングコントローラーの作成2

#自己課題
- ログインページの重複を消す。facebookとmesseage

#part4-2-3 リスティングnewページを整える

#自己課題


#part4-3-1 リスティングcreate

##listingコントローラーに追記。

    def new
      #現在のユーザーもlistingの作成
      @listing = current_user.listings.build
    end

    def create
      #パラメーターととと現在のユーザーのlistingを作成
      @listing = current_user.listings.build(listing_params)

      if @listing.save
        redirect_to edit_listing_path(@listing), notice: "リスティングを作成・保存しました。"
      else
        redirect_to new_listing_path, notice: "リスティングを作成・保存できませんでした。"
      end
    end

    def edit
    end

    def update
    end

    private
    def listing_params
      params.require(:listing).permit(:home_type, :pet_type, :breeding_years, :pet_size)
    end

#自己課題
- シッター情報を入力し、保存できるようにする。

#part4-3-2　createした後に飛ぶページを変更する

もっと新たな情報を入力するために新しいページを作成する。

path manage-listing_basics
URL manage-listing/:id/basics
action listings#basics

のページを作成しようと思ったら、以下のコードをroutes.rbに記入。

    get 'manage-listing/:id/basics' => 'listings#basics', as: 'manage-listing_basics'

#自己課題
-　routesとviewを作成

#part4-4 リスティング編集ページ(basics)

#自己課題
- 

#part4-5-1 リスティング編集ページ(リスティング内
#自己課題
- descriptionアクションを追加。ルートもね。

#part4-5-2 リスティング編集ページ続き

#controller内で共通の変数をもつ場合。
private の下に適当に関数を定義。set_listingとしたら、

    before_action :set_listing, only:[:basics, :description, :address, :price, :photos, :calender, :bankaccount, :publish]

以下のコードを上に書くことによりまとめることができる。


#自己課題
- すべてのactionに対し、ルート、verticalnavberにリンク。



#part4-6 verticalナブバーのactive

表示しているページがnavbar上でわかるようにしたい。

この記述をhelpers/application_helper.rb加える。

helperに関数をかけば、全てのページで呼び出せるようになる。

```ruby:application_helper.rb

	module ApplicationHelper
		def controller?(controller) #controller?という関数名でcontrollerという引数を持っている。
			controller.include?(params[:controller]) #引数のcontrollerの中に、
#現在のコントローラー（後ろのコントローラー :controllerのこと）が含まれていたら、True.
		end

		def action?(action)
			action.include?(params[:action])
		end
	end
```

vertivalnavbarの一つ一つの要素にこれを書く。

```html.erb:application_helper.rb
<li class = "<%= 'active' if controller?("listings") && action?("basics") %>" >
    <%= link_to"基本事項", manage_listing_basics_path(@listing) %>
</li>
```

controller?とactionがTureならば、activeが追加される。

[参照](https://stackoverflow.com/questions/3705898/best-way-to-add-current-class-to-nav-in-rails-3)

add class nav active stackflow railsとかでググれば出てくる。ググり力大事。

#自己課題
- verticalnavbarに、見ているページにactiveクラスを追加。