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) =========================
そのまま使う。
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