Cursorを使ってrubyコードを生成してみた

## Cursorとは
前から使ってみたいと思っていたCursorを今回使ってみました。

Cursorとはchatgptを組み込んだコードエディターです。
会話ベースでコードを書いてくれたり、修正してくれます。
VSCodeをフォークしているみたいなので、今までVSCodeを使っていた方は直感的に使えると思います。

## インストール方法

インストール方法や使い方はこちらの記事を参考にさせていただきました。

https://blog.future.ad.jp/cursor

ダウンロードは以下の公式からできます。

https://www.cursor.com/

## rubyでCursorを使ってみる
私はWSLに接続し、docker環境で使ってみることにしました。
任意の場所に、test.rbを作成します。
Ctrl + Kを押すと、以下のように入力フォームが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/76e50f17-c94f-bb0a-4af4-1689203c1fa1.png)

### じゃんけんゲームの作成
今回はCLIで動作するじゃんけんゲームを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/d90edbe2-0b7f-65eb-863e-c7443f3c9795.png)

Enterを押すと、以下のようにコードが生成されました。すごいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/f1154624-afda-ae08-d86d-89f4b28531d7.png)

Acceptすると、コードを受け入れることができます。
生成されたコードは以下です。
```rb
class JankenGame
  CHOICES = ["グー", "チョキ", "パー"]

  def initialize
    @player_score = 0
    @computer_score = 0
  end

  def play
    loop do
      player_choice = player_turn
      computer_choice = computer_turn
      result = judge(player_choice, computer_choice)
      display_result(player_choice, computer_choice, result)
      break unless play_again?
    end
    display_final_score
  end

  private

  def player_turn
    puts "じゃんけんポン！ (0: グー, 1: チョキ, 2: パー)"
    choice = gets.chomp.to_i
    until choice.between?(0, 2)
      puts "無効な選択です。もう一度選んでください。 (0: グー, 1: チョキ, 2: パー)"
      choice = gets.chomp.to_i
    end
    CHOICES[choice]
  end

  def computer_turn
    CHOICES.sample
  end

  def judge(player_choice, computer_choice)
    if player_choice == computer_choice
      "引き分け"
    elsif (player_choice == "グー" && computer_choice == "チョキ") ||
          (player_choice == "チョキ" && computer_choice == "パー") ||
          (player_choice == "パー" && computer_choice == "グー")
      @player_score += 1
      "勝ち"
    else
      @computer_score += 1
      "負け"
    end
  end

  def display_result(player_choice, computer_choice, result)
    puts "あなたの選択: #{player_choice}, コンピュータの選択: #{computer_choice}"
    puts "結果: あなたの#{result}です！"
  end

  def play_again?
    puts "もう一度プレイしますか？ (y/n)"
    gets.chomp.downcase == 'y'
  end

  def display_final_score
    puts "最終スコア - あなた: #{@player_score}, コンピュータ: #{@computer_score}"
  end
end

game = JankenGame.new
game.play

```

### 実際の動作
実際に動かしてみます。
```sh
$ docker compose run --rm web ruby test.rb
[+] Running 1/0
 ⠿ Container rails_sample-db-1  Running                                                                                                                                  0.0s
じゃんけんポン！ (0: グー, 1: チョキ, 2: パー)
2
あなたの選択: パー, コンピュータの選択: チョキ
結果: あなたの負けです！
もう一度プレイしますか？ (y/n)
y
じゃんけんポン！ (0: グー, 1: チョキ, 2: パー)
1
あなたの選択: チョキ, コンピュータの選択: パー
結果: あなたの勝ちです！
もう一度プレイしますか？ (y/n)
n
最終スコア - あなた: 1, コンピュータ: 1
```

しっかりとじゃんけんゲームがつくられています！

### コードの説明
Ctrl + Lを押すと対話式に、コードの説明をしてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/903620fb-04de-144d-5536-0f323e719395.png)

しっかりと各メソッドについて説明をしてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/c86e65ae-dc3c-f7db-eb2a-5d09c9e6805f.png)

## application_controllerを作成してもらう
今度はrailsのapplication_controllerに必要なコードを作成してもらいます。
生成されたものは以下です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/ce5f5282-6a1f-ace3-e7cc-193d72c36ac9.png)

説明もしてもらいました。

>各部分の説明
>・class ApplicationController < ActionController::Base: これは ApplicationController クラスの定義で、ActionController::Base を継承しています。ApplicationController は他のすべてのコントローラーの基本クラスです。
>
>protect_from_forgery with: :exception: これはクロスサイトリクエストフォージェリ (CSRF) 攻撃からアプリケーションを保護するための設定です。CSRFトークンが一致しない場合に例外を発生させます。
>
>before_action :configure_permitted_parameters, if: :devise_controller?: これは Devise コントローラーが使用される前に configure_permitted_parameters メソッドを実行するためのフィルターです。
>
>protected: これは以下のメソッドが保護されたメソッドであることを示します。保護されたメソッドはクラス内でのみ呼び出すことができます。
>
>def configure_permitted_parameters: これは Devise のパラメータサニタイザーを設定するメソッドです。
>
>devise_parameter_sanitizer.permit(:sign_up, keys: [:username]): これはサインアップ時に :username パラメータを許可します。
>
>devise_parameter_sanitizer.permit(:account_update, keys: [:username]): これはアカウント更新時に :username パラメータを許可します。
>
>この設定により、ユーザーがサインアップやアカウント更新を行う際に :username パラメータを送信できるようになります。

## 最後に
CursorはVSCodeをフォークしてるだけあって使いやすく、コード生成や説明のやり方も簡単で分かりやすいなと思いました。
今回はやっていないですが、リポジトリの説明をしてくれたり、コードの修正もしてくれるみたいです。
ぜひ、気になった方は使ってみてください。