Ruby on Rails を使って「W3Qみたいなアプリ」を作ってみる③

Ruby on Railsの使い方をマスターすべく、W3Qみたいなアプリを作ってみようと思います!

前回は環境構築したので、さっそく機能を作っていきます!


今回やること:質問投稿機能を作る

質問コントローラーとビューを作る

アプリのディレクトリへ移動して、質問を投稿するためのコントローラーを作る。

cd w3q-app
rails g controller posts index


・app/controllers/posts_controller.rb
・app/views/posts/index.html.erb
が作成されてます。
とりあえず、質問一覧(仮)が入るようにしてみる。

<h1>質問内容</h1>
<p>ここに気になることを投稿する</p>
<h2>質問一覧</h2>
<ul>
    <% @posts.each do |post| %>
        <li><%= post %></li>
    <% end %>
</ul>
class PostsController < ApplicationController
  def index
    #適当なpostsを用意
    @posts = ["test1","test2","test3"]
  end
end
Rails.application.routes.draw do
  #ルートディレクトリに表示するように設定
  get '/' => 'posts#index'
end

ひとまず、一覧表示はできた!
こんな感じです↓
f:id:takoyarosan:20180808233241p:plain


質問テーブルを作る

rails g model Post content:text user_id:string

・app/model/post.rb
・app/db/migrate/20180808144010_create_posts.rb
が作成されてます。


マイグレーションファイルの中身
app/db/migrate/20180808144010_create_posts.rb

class CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
      t.text :content
      t.string :user_id

      t.timestamps
    end
  end
end


マイグレーションファイルを使ってテーブルを作成

rails db:migrate

作成したテーブルの確認

コンソール開始
rails dbconsole

テーブルの情報表示
.shcema posts

表示内容
CREATE TABLE "posts" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "content" text, "user_id" varchar, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);

終了
.quit

フォームの作成

テーブルができたので、フォーム入力からの値をテーブルに保存するとこを実装してみます。


htmlにform_tagを追加します。
link_toを使って、質問の個別ページへ遷移できるようにしておきます。

<h1>質問内容</h1>
<p>ここに気になることを投稿する</p>

<%= form_tag("/posts/create") do %>
    <textarea name="content"></textarea>
    <input type="submit" value="投稿">
<% end %>

<h2>質問一覧</h2>
<ul>
    <% @posts.each do |post| %>
        <li id="topic-<%= post.id %>">
            <%= link_to "/q/#{post.id}" do %>
                <span><%= post.id %><%= post.user_id %><%= post.created_at %></span>
                <br>投稿内容:<%= post.content %>
            <% end %>
        </li>
    <% end %>
</ul>
class PostsController < ApplicationController
  
  #投稿一覧表示
  def index
    @posts = Post.all.order(created_at: :desc)
  end

  #新規投稿
  def create
    #/posts/indexへリダイレクト
    @post = Post.new(
      content: params[:content],
      user_id: "test"
      )
    @post.save

    #元のページへ戻る(アクション:/posts/indexを呼び出す)
    redirect_to("/")
  end
end
Rails.application.routes.draw do
  #createのルーティングを追加
  post 'posts/create' => 'posts#create'
  get '/' => 'posts#index'
end

投稿してみるとこんな感じに反映されます↓
f:id:takoyarosan:20180809205248p:plain

まとめ

今回は質問投稿の処理を作ってみました。

次回は回答の処理を作ってみます!