Progate +α メモず【Ruby on Rails ⑥⑦】

# はじめに
Ruby on Rails学習レッスン⑥は⑤の応用だったので、特に新しい要素はなし。
細かなミスを繰り返しながら学びました。
⑦はユーザー画像の表示！ひそかに楽しみにしてたところ🥳

# メモず
## `$ rails g migration file_name`
マイグレーションファイルのみを作成。
## マイグレーションファイルの書き方
```rb
class MigrationName < ActiveRecord::Migration[5.0]
	def change
		method_name :table_name, :column_name, :data_type
	end
end
```
Ruby on Railsのマイグレーションファイル内の`change`メソッドは、データベーススキーマの変更を定義するために使われます。このメソッド内で行うことができる代表的な操作は以下の通りです。
### 代表的なメソッド
#### テーブルの作成
```ruby
def change
  create_table :users do |t|
    t.string :name
    t.string :email
    t.timestamps
  end
end
```
この例では、`users`という新しいテーブルを作成し、`name`と`email`という文字列カラムを追加しています。また、`timestamps`メソッドは`created_at`と`updated_at`という2つのタイムスタンプカラムを自動的に追加します。
### カラムの追加
```ruby
def change
  add_column :users, :age, :integer
end
```
ここでは、`users`テーブルに`age`という整数型のカラムを追加しています。
### カラムの削除
```ruby
def change
  remove_column :users, :age
end
```
この例では、`users`テーブルから`age`カラムを削除しています。
### カラムの名前変更
```ruby
def change
  rename_column :users, :name, :full_name
end
```
この操作では、`users`テーブルの`name`カラムの名前を`full_name`に変更しています。
### インデックスの追加
```ruby
def change
  add_index :users, :email, unique: true
end
```
ここでは、`users`テーブルの`email`カラムに一意性を保証するインデックスを追加しています。
## `form_tag`のオプショナルな引数
>1. **`:method` -** フォームが使用するHTTPメソッドを指定します（`:get`、`:post`、`:put`、`:delete`など）。
>   ```ruby
>   form_tag('/posts', method: :post)
>   ```

>2. **`:multipart` -** フォームがファイルアップロードを含む場合に`true`に設定します。
>   ```ruby
>   form_tag('/upload', multipart: true)
>   ```

>3. **`:class` -** フォームタグにCSSクラスを追加します。
>   ```ruby
>   form_tag('/search', class: 'search-form')
>   ```

>4. **`:id` -** フォームタグにIDを追加します。
>   ```ruby
>   form_tag('/subscribe', id: 'subscribe-form')
>   ```

>5. **`:authenticity_token` -** Railsのクロスサイトリクエストフォージェリ（CSRF）保護>を使うかどうかを指定します。通常は`true`がデフォルトですが、必要に応じて`false`に設定することができます。
>   ```ruby
>   form_tag('/posts', authenticity_token: true)
>   ```

## `File.write("file_path/file_name.ext", "content")`
ファイルの保存を行う。
### `File`クラスの代表的なメソッド
Rubyにおける`File`クラスは、ファイルシステム上のファイルを操作するために多くのメソッドを提供しています。以下に、`File`クラスの代表的なメソッドをいくつか紹介します。

#### ファイルの読み書き
>1. **`open`**
 >  - ファイルを開くために使用します。読み込み、書き込み、または両方のモードでファイルを開くことができます。
>   ```ruby
>   File.open('example.txt', 'w')
>   ```

>2. **`read`**
  > - ファイルの内容を全て読み込みます。
>   ```ruby
>   File.read('example.txt')
>   ```

>3. **`write`**
  > - ファイルにデータを書き込みます。
>   ```ruby
>   File.write('example.txt', 'Hello, world!')
>   ```

>4. **`close`**
  > - 開いたファイルを閉じます。
>   ```ruby
>   file = File.open('example.txt', 'w')
>   file.close
>   ```
#### ファイルの情報と操作

>5. **`exist?`**
  > - 指定されたファイルが存在するかどうかを確認します。
>   ```ruby
>   File.exist?('example.txt')
>   ```

>6. **`delete`**
  > - ファイルを削除します。
>   ```ruby
>   File.delete('example.txt')
>   ```

>7. **`size`**
  > - ファイルのサイズをバイト単位で返します。
>   ```ruby
>   File.size('example.txt')
>   ```

>8. **`rename`**
  > - ファイルの名前を変更します。
>   ```ruby
>   File.rename('example.txt', 'new_example.txt')
>   ```

>9. **`mtime`**
  > - ファイルの最終変更時刻を返します。
>   ```ruby
>   File.mtime('example.txt')
>   ```

#### ディレクトリとファイルの区別

>10. **`directory?`**
>    - 指定されたパスがディレクトリかどうかを確認します。
>    ```ruby
>  File.directory?('/path/to/dir')
>    ```

>11. **`file?`**
>    - 指定されたパスが通常のファイルかどうかを確認します。
>    ```ruby
>  File.file?('example.txt')
>    ```

これらのメソッドは、ファイルの操作、属性の取得、およびファイルシステムとのインタラクションに広く使用されます。`File`クラスは`IO`クラスを継承しているため、ファイルの読み書きに関連する多くの機能を`IO`クラスからも受け継いでいます。
## 画像の更新は、新規に画像が送られた時だけ
あたりまえだけど、忘れがちで大事なこと。
```ruby
image = params[:image]
if image
  @user.image_name = "#{@user.id}.jpg"
  File.binwrite("public/user_images/#{@user.image_name}", image.read)
end
```
# 終わりに
全体的にHTML/CSS ~ ここまでの復習・応用の面が強く、
記事の内容もChatGPTに代表的な使い方を聞いた部分がほとんどですね。

復習の中では細かいミスを繰り返したんですが、細かいとはいえ、やっぱりちゃんとわかってないところなんですよね。ミニ道場みたいな感じで、この⑥⑦で定着したものは大きかったと思います。Progateのカリキュラム、恐るべし・・・・・・