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

前回は質問投稿の処理を作ったので、今回は回答投稿の処理を作ります。
質問と作り方は同じなのでサクッと。

質問の個別ページを作成

/app/views/posts/show.html.erb を作ります。

<h2>質問内容</h2>
<div>
    <span><%= @post.id %><%= @post.user_id %><%= @post.created_at %></span>
    <br>投稿内容:<%= @post.content %>
</div>


/app/controllers/posts_controller.rb にshowメソッドを追加。

  def show
    #params[:id]でURLの値を取得する。
    @post = Post.find_by(id: params[:id])
  end


/config/routes.rb
質問個別ページへのリンクをクリックしたときのルーティングを追加。
https://xxxxxxxxxx/q/1」の場合、「1」が「params[:id]」に入る。

  get 'q/:id' => 'posts#show' #質問の個別ページへ

質問の個別ページができた。

シンプルですが、こんな感じです。

質問一覧ページから、質問をクリック。
f:id:takoyarosan:20180813212210p:plain

質問個別ページへ画面遷移する。
f:id:takoyarosan:20180813212129p:plain


回答投稿の機能を作る

次に質問に対する回答投稿の機能を作ります!

回答テーブルの作成

マイグレーションファイルの作成
rails g model Answer content:text q_id:integer user_id:string

テーブル作成
rails db:migrate

コントローラー作成

rails g controller answers

作成したコントローラーにcreateメソッドを追加する。

    def create
        @answer = Answer.new(
          content: params[:content],
          q_id: params[:id],
          user_id: "ans_user"
          )
        @answer.save
    
        #元のページへ戻る(アクション:/q/id を呼び出す)
        redirect_to("/q/#{params[:id]}")
    end

ビューの作成

さっき作った /app/views/posts/show.html.erb に回答一覧を表示する部分を追加します。

<h2>回答する</h2>
<%= form_tag("/q/#{@post.id}/create") do %>
    <textarea name="content"></textarea>
    <input type="submit" value="投稿">
<% end %>

<h2>回答一覧</h2>
<ul>
    <% if @answers.empty? then %>
        回答はまだありません。
    <% else %>
        <% @answers.each do |answer| %>
            <li>
                <span><%= answer.id %><%= answer.user_id %><%= answer.created_at %></span>
                <br>回答内容:<%= answer.content %>
            </li>
        <% end %>
    <% end %>
</ul>

ルーティング

/config/routes.rb
回答の投稿ボタンを押したときのルーティングを追加。

  post 'q/:id/create' => 'answers#create' #回答を作成

回答投稿の機能ができた!

とりあえず、こんな感じです。

フォームに回答を入力して投稿ボタンを押すと、一覧が表示されます。
質問の処理と同じですね。
f:id:takoyarosan:20180813213136p:plain

まとめ

質問の個別ページと回答投稿機能を作りました!

次回は削除機能を作ろうと思います!