rails5 プロゲートをしながらのメモ

自分用の整理メモです。

# アクションとビューファイルの関係
homeコントローラのtopアクションは、コントローラと同じ名前のビューフォルダ(homeフォルダ)から、アクションと同じ名前のビューファイル(top.html.erb)を探し、ブラウザに返していることを理解しておきましょう。

# パラメータを表示させる
``` routes.rb
post 'users/hogehoge', to: 'users#hogehoge'
```
'users/hogehoge'に対してpostをするとusersコントローラのhogehogeアクションを期待する。

```***.controller.rb
def hogehoge
end
```
hogehogeが作動して

```hogehoge.html.erb
<% params[:id] %>
```
自動的にアクション名に対応しているビューファイルにパラメータを表示できる。

# CSSファイルの場所
CSSファイルは「app/assets/stylesheets」フォルダに入っています。
Railsでは、「stylesheets」フォルダの中に保存されているCSSファイルに
コードを書けば、すべてのビューにCSSが適用されます。

# 画像ファイルの場所
画像は、「public」フォルダに配置しておくと、「＜img src="/画像名" >」や「background-image: url("/画像名");」のように、画像名を指定するだけで、簡単に画像を表示することができます。

```scss
background-image: url("/top.jpg");
```

# リンクの作り方
リンクを作成するためには、<a>タグでテキストを囲み、「href=" "」の中にURLを指定する必要
```
<a href="/about">＊＊＊＊＊＊</a>
```
erb」とは「Embedded Ruby（埋め込みRuby）」の略

変数をビューファイル内で定義してきたが、 Rails ではビューではなく、アクションで定義することが一般的

変数名を「@」から始めることでこの変数は特殊な変数となり、ビューファイルでも使用することができます。

# マイグレーション
マイグレーション（migration）とは、本来「移動」や「移住」といった意味を持ち、主にIT用語では、既存のシステムやソフトウェアなどを新しいプラットフォームやシステムに移行することをいいます。

出典 https://persol-tech-s.co.jp/hatalabo/it_engineer/460.html#_

## マイグレーションファイルと呼ばれる、データベースに変更を指示するためのファイルを作成しましょう。

## データベースに変更を反映する　rails db:migrate
・マイグレーションファイルを作成したあとに実行する
・コマンドを実行しなければマイグレーションエラーを実行する

# モデル
ApplicationRecordを継承したクラスのこと。

# モデルからデータベースへの保存の流れ
モデル（例　User.new)からインスタンス(例 @user)を生成した後にデータベース(userテーブル）保存する。

## カラムの自動生成
created_atカラムとupdated_atカラムには、データベースに保存された時刻が自動で入るようになっています。
updated_atはデータ更新時にも時刻が更新されます。

# 共通のレイアウト
Railsでは、「views/layouts/application.html.erb」に共通のHTMLを書いておくことができます。
## ＜%= yield %>
他のビューファイルの内容を代入させることができる。
「views/layouts/application.html.erb」には<%= yield %>というコードがあります。top.html.erbなどの各ビューファイルは、この<%= yield %>の部分に代入され、application.html.erbの一部としてブラウザに表示されていました。

# find_by
find_byメソッドは、ある条件に合致するデータを取得することができます。

# ルーティングの規則
・「posts/:id」というルーティングは「posts/index」より下に書かなければいけません。
・newはshowよりも上に書く

# リダイレクト
他のURLに転送する
```
redirect_to("/posts/index")
```
# ＜textarea＞
・<textarea>タグにname属性を指定すると、入力データを送信することができる。
・name属性の値をキーとしたハッシュがRails側に送られます。

出典 プロゲート

# post "posts/:id/edit" => "posts#edit" :idがわからない

# <%= link_to("編集", "/posts/#{@post.id}/edit") %>
# http動詞がうまく理解できていない。
# @post.content.saveで保存できないのかな。
# redirect_to render
redirect_toはURLを指定して「redirect_to(URL)」のように書きます。一方renderはビューファイルを指定して「render("フォルダ名/ファイル名")」

# エラーメッセージの取得
@post.errors.full_messagesの中に、エラー内容が配列で入ります。
saveメソッドで保存する前は、エラーメッセージが生成されていない

# flash
アクションで変数flash[:notice]に文字列を代入すると、flash[:notice]をビューで使うことができます。変数flashは１度表示された後に自動で削除されるようになっています。

# 編集、削除の流れ
バリデーションを通過、成功/失敗をし、メッセージが表示され、一覧で確認。

# ＜textarea name= content >
nameをつけることで属性をつけることができる。

#
```
<div class="main posts-new">
  <div class="container">
    <h1 class="form-heading">編集する</h1>
    <% form_tag("posts/#{@post.id}/update") do %>
      <div class="form">
        <div class="form-body">
          <% @post.errors.full_messages.each do |message| %>
            <div class="form-error">
              <%= message %>
            </div>
          <% end %>
          <textarea name="content"><%= @post.content %></textarea>
          <input type="submit" value="保存">
        </div>
      </div>
    <% end %>
  </div>
</div>
```
# 
```
def create
    @post = Post.new(content: params[:content])
    if @post.save
      flash[:notice] = "投稿を作成しました"
      redirect_to("/posts/index")
    else
      render("posts/new")
    end
  end
  
  def edit
    @post = Post.find_by(id: params[:id])
  end
  
  def update
    @post = Post.find_by(id: params[:id])
    @post.content = params[:content]
    if @post.save
      flash[:notice] = "投稿を編集しました"
      redirect_to("posts/index")
    else
      render("posts/edit")
  end
```
#
```
<%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"}) %>
```
```
def new
    # Userインスタンスを作成し、変数@userに代入してください
    @user = User.new
    
  end
```
```
image_name: "default_user.jpg"
```
# 画像の追加
・<input>タグに「type="file"」を追加
・画像の送信は特殊なので、form_tagに{multipart: true}を追加

# Rubyのコードでファイルを扱うには、Rubyに元から用意されてあるFileクラスを用います
「File.write(ファイルの場所, ファイルの中身)」とすることで、ファイルを作成することができます。
File.writeではなくFile.binwriteを用いる必要があります。図のように変数imageに対し、readメソッドを用いることでその画像データを取得できます。

```
 # 画像を保存する処理を追加してください
    if params[:image]
      @user.image_name = "#{@user.id}".jpg
      image = params[:image]
      File.binwrite("public/user_images/#{@user.image_name}", image.read)
```
# パスワード
type属性をpasswordとすると右の図のように、入力したパスワードが伏字となるパスワード用のフォームになります
（link_toメソッドではデフォルトでgetのルーティングを探し、form_tagメソッドがデフォルトでpostのルーティングを探します。）

# session
ページを移動してもユーザー情報を保持し続けるために、sessionという特殊な変数を用います。
sessionに代入された値はブラウザに保存される
```rb
session[:user_id] = @user.id
```

# 登録時にパスワードを保存する
登録アクションの時の属性にパスワードを追加する。
idでデータベースから紐付けする。

# ログイン中のユーザー名を表示する
sessionを使いログインさせる。

# NoMethodError in UsersController#login_form
綴違い

# アクセス制限
リダイレクトさせる
onlyを用いて指定したアクションでのみそのメソッドを実行する
@変数で定義した変数は同じクラスの異なるメソッド間で共通して使用することが可能

# 機能を使わせるにはチェックをさせる
```rb
@current_user == nil
```
@current_userが空であればリダイレクトさせる

# ログインユーザーを禁止する
ログインユーザーが存在する場合、投稿一覧ページにリダイレクトする

# 編集の制限
他のユーザーから編集されてしまう。
```rb
@user.id == @current_user
```
これを使い要求されたidと@current_userのidgaが一致することによって編集の制限をつける

## SyntaxError in UsersController#show
構文エラー
```rb
<%= if @user.id == @current_user.id %>
```
条件分のところは表示しなくてもいいので=を取り除く
成功
次は編集が表示されない
これは＝がついていないからブラウザに表示されない
```rb
<%= link_to("編集", "/users/#{@user.id}/edit") %>
```
成功

# ユーザーの編集を制限
ビューだけでないくアクション側からも表示しないようにする
## to_iメソッド
文字列を数値に変換
## 
```rb
if @current_user.id != params[:id].to_i
```
## @current_userにはidがあるなんでだろう？
アプリケーションコントローラで@current_userが定義されてからアクションが作動しているから
## @params[:id].to_iは何だろう？
パスの中に数字があるからそこから取るのかな。