Ruby on Railsで作るQ & Aアプリ

環境構築

#バージョン確認
ruby -v

#開発環境に移動後、Railsをインストール
rails _7.0.0_ new qanda

開発環境で構築していくので、config>development.rbに以下の設定を入れる。

※Blocked hostエラーを起こさせないようにするため

Rails.application.configure do
    #中略

    config.hosts.clear
end

そして、開発環境を立ち上げる

rails s

問題なければ、control + Cキーで開発サーバーを終了

質問コントローラーを作成

rails g cotroller questions 

コントローラーが生成できたか確認。

app > controllers > questions_controller.rb

ができていれば、開く。

class QuestionsController < ApplicationController
        ###### 追記 ######    
        # 質問一覧表示
    def index

    end

    # 質問詳細表示
    def show

    end

    # 質問の作成
    def new

    end

    # 質問の登録
    def create

    end

    # 質問の編集
    def edit

    end

    # 質問の更新
    def update

    end

    # 質問の削除
    def destroy

    end
        ###### 追記 ######   
end

モデルを作成

rails g model Question name:string title:string content:text

モデルが作成されているか確認。

app > models > question.rb

次にmigrateファイルも見てみる。

db > migrate > 数字_create_questions.rb が出来ている。開いてみると

class CreateQuestions < ActiveRecord::Migration[7.0]
  def change
    create_table :questions do |t|
      t.string :name
      t.string :title
      t.text :content

      t.timestamps
    end
  end
end

ここまでの状態であれば、今なら修正可能。

ここまでの情報をdbに反映。migrateを作成。

rails db:migrate
== 20230823114948 CreateQuestions: migrating ==================================
-- create_table(:questions)
   -> 0.0008s
== 20230823114948 CreateQuestions: migrated (0.0009s) =========================

railsはデフォではsqlite

そのまま使う。

sqliteを開く。

rails dbconsole

# >sqlに変わったあと
.tables

# ar_internal_metadata  questions             schema_migrations
#questionsテーブルが作成出来ているのが確認できた

#スキーマを確認
.schema questions

# CREATEテーブルで生成された
# CREATE TABLE IF NOT EXISTS "questions" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "title" varchar, "content" text, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL);

# rubyコンソールを抜ける
.q

ルーティングを設定

ルーティング=URLとアクションを結びつけるもの。

コントローラークラスに実装された、それぞれのメソッドが実行されることになる。

CRUDで使うルーティングを自動生成する。

config > routes.rb

Rails.application.routes.draw do
  # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html

  # Defines the root path route ("/")
  # root "articles#index"
  resources :questions
end

この記述で、CRUDアプリケーションで使うルーティングを自動生成することができます。

ルーティングを確認するには、以下のコマンドです。

rails routes

新規質問登録機能を追加

view側で空のインスタンスモデルのオブジェクトを使うため、準備をする。

newメソッドが質問画面を作成したときに呼ばれます。

class QuestionsController < ApplicationController
    # (中略)

  # 質問の作成
    # Questionモデルのインスタンスを新規に作成
  def new
    @question = Question.new
  end

    # (中略)
end

app > views > questions

new.html.erb

を作成し、以下を記述。

<h1>New Question</h1>
<%= form_with model: @question do |form| %>
    <div>
        <%= form.label :title %><br>
        <%= form.text_field :title %>
    </div>
    <div>
        <%= form.label :name %><br>
        <%= form.text_field :name %>
    </div>
    <div>
        <%= form.label :content %><br>
        <%= form.text_area :content %>
    </div>
    <div>
        <%= form.submit %>
    </div>
<% end %>

http://127.0.0.1:3000/questions/new

で反映を確認。

rails s

ここでメソッドを紹介。

p
[Ruby]
pメソッドは、引数に文字列や変数を指定すると、それを人が見やすい形に整形して標準出力に出力します。
[参考URL](https://style.potepan.com/articles/29736.html)
params
[Rails]
クライアントからURLやフォームで送信された値(パラメータ)を取得するメソッドです。
[参考URL](https://qiita.com/sleepy_cat/items/c8eecfc5c486b0f7f2b8)

上記を用いて、コントローラーを修正。

class QuestionsController < ApplicationController
    # (中略)

    # 質問の登録
    def create
        p params
    end

    # (中略)
end

仮のデータを入れて、データベースに保存してみる。

ストロングパラメーターを使う

フォームの送信途中に改ざんできないようにする。

requireメソッドでデータのオブジェクト名を指定する(この場合はquestion)。

class QuestionsController < ApplicationController
 ##中略##

  # 質問の作成
  def new
    @question = Question.new
  end

  # 質問の登録
  def create
    # p params
    p quetion_params
  end

  ##中略##

  private
  def quetion_params
    params.require(:question).permit(:title, :name, :content)
  end
end