LoginSignup
0
0

More than 1 year has passed since last update.

【rails】ログインユーザーに一回だけ回答させる (サンプル例)

Last updated at Posted at 2021-11-25

ログイン、質問投稿、投稿に対する回答ができるアプリがある。
各ユーザーが各質問に対して一回だけ回答できるように設定したい

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 %>

等細かい条件を設定可能

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0