ログイン、質問投稿、投稿に対する回答ができるアプリがある。
各ユーザーが各質問に対して一回だけ回答できるように設定したい
1.モデル
ユーザーを表すmemberモデル、投稿した質問に関するpostモデル、
質問に対する回答を表すanswerモデルがそれぞれある。
各モデルの関係は以下
app/models/answer.rb
class Answer < ApplicationRecord
belongs_to :member
belongs_to :post
end
app/models/post.rb
class Post < ApplicationRecord
has_many :answers, dependent: :destroy
belongs_to :member
end
app/models/member.rb
class Member < ApplicationRecord
has_many :answers, dependent: :destroy
has_many :posts, dependent: :destroy
end
2. コントローラーファイル
post,answerのコントローラーについては以下
app/controllers/posts_controller.rb
class PostsController < ApplicationController
def index # 質問一覧を表示する画面
@posts = Post.all
end
def show # 投稿内容、と回答内容をまとめて見れる画面
@post = Post.find(params[:id])
# 現ログインユーザーが一回既に回答してたらそれ以上回答できなくする
@answer = Answer.find_by(post_id: params[:id], member_id: current_member.id)
@answers = @post.answers # postに紐づくanswerを表示させる
end
def new
@newpost = Post.new
end
def create
@newpost = current_member.posts.build(post_params)
redirect_to public_posts_path
end
....
end
app/controllers/answers_controller.rb
class AnswersController < ApplicationController
def new # 新規回答画面
@newanswer = Answer.new
end
def create # 新規回答作成
@newanswer = Answer.new(answer_params)
@newanswer.member = current_member
redirect_to public_post_path(@newanswer.post_id)
end
....
end
3.viewファイル
以下については割愛
・posts/index.html.erb(質問投稿一覧画面)
・posts/new.html.erb(新規質問投稿作成画面)
・answers/new.html.erb(新規回答作成画面)
以下のようなposts/show.html.erb ファイルを作成することでpostの内容とそれに紐づくanswer内容、answers/new.html.erbへ行くリンクを表示可能
※answer内のanswerbody等、具体的なカラムについては割愛
app/views/posts/show.html.erb
<%= link_to ' 新規回答投稿する', new_post_answer_path(@post) %>
<table>
(~質問内容表示~)
<%= @post.posttitle %>
<%= @post.postbody %>
....
(~~回答内容を表示~~)
<% @answers.each do |answer| %>
<%= answer.answerbody %>
<%= answer.updated_at %>
....
<% end %>
</table>
上記ファイルの冒頭に以下のような条件分岐を設けることで
現ログインユーザー(current_member)が既に回答した場合、
新規回答作成画面へのリンクを表示できなくさせることができる。
<% if @answer.blank? %>
<%= link_to ' 新規回答投稿する', new_post_answer_path(@post) %>
<% end %>
さらに以下を付け加えれば、「そもそも非ログイン状態だと回答できない」
<% if member_signed_in? %>
<% end %>
「質問を作成したユーザーだと回答できない」
<% if @post.member.id != current_member.id %>
<% end %>
等細かい条件を設定可能