前提・実現したいこと
railsで投票アプリを開発中です。
ラジオボタンで回答を一つ選び投票をする機能を実装したいと考えています。
誰がどの質問にどの回答を選んだのかが分かるように、
voteテーブルには、user_id, question_id, answer_idの3つの値が
入ることを想定しています。
解決したい問題
下記のソースにより、回答を一つ選び、投票してもvoteテーブルに値が入りません。
どこに問題があり、どのようなソースが適切か、ご教授いただけると幸いです。
model
vote.rb
class Vote < ApplicationRecord
belongs_to :user
belongs_to :question
belongs_to :answer
end
question.rb
class Question < ApplicationRecord
belongs_to :user
has_many :answers, dependent: :delete_all
has_many :votes, dependent: :delete_all
accepts_nested_attributes_for :answers, allow_destroy: true
end
answer.rb
class Answer < ApplicationRecord
belongs_to :question
has_many :votes
end
user.rb
class User < ApplicationRecord
...
has_many :questions
has_many :votes
end
migrate
create_votes.rb
class CreateViews < ActiveRecord::Migration[5.1]
def change
create_table :views do |t|
t.references :user, foreign_key: true
t.references :question, foreign_key: true
t.references :answer, foreign_key: true
end
end
end
view
questions/show.html ※テストのためanswer_idには「1」が入るように記述しております
<h2><%= @question.title %></h2>
<p><%= @question.body %></p>
<ul style="list-style-type: none">
<%= form_for([@question, @question.votes.build]) do |f| %>
<% @question.answers.each do |a|%>
<li><label><%= f.radio_button :answer_id, 1, class: :rd %><%= a.answer %></label></li>
<%= f.hidden_field :user_id, value: current_user.id %>
<% end %>
<%= f.submit%>
<% end %>
</ul>
controller
questions_controller.rb
class QuestionsController < ApplicationController
before_action :set_question, only: [:show, :edit, :update, :destroy]
・・・
def index
@questions = Question.all.order(created_at: :desc)
end
def show
end
・・・
private
def set_question
@question = Question.find(params[:id])
end
・・・
votes_controller.rb
class VotesController < ApplicationController
def create
@question = Question.find(params[:question_id])
@question.votes.create(vote_params)
redirect_to questions_path(@question)
end
private
def vote_params
params.require(:vote).permit(:answer_id, :user_id, :question_id)
end
end
route
routes.rb
Rails.application.routes.draw do
devise_for :users
resources :questions do
resources :votes
end
root to: 'questions#index'
end
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
create_votes.rbについて、
class CreateViews < ActiveRecord::Migration[5.1]
def change
create_table :views do |t|
t.references :user, foreign_key: true
t.references :question, foreign_key: true
t.references :answer, foreign_key: true
end
end
end
と、votesではなくviewsになっているのですが、ここは単なる転記ミスでしょうか?
あとは、「投票してもvoteテーブルに値が入りません。」というのは具体的にはどうなりましたか?
- 遷移先のURL
- ログの出力
- 何かしらのエラーメッセージが出たかどうか
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.20%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/08/13 10:10
・遷移先のURL
http://localhost:3000/questions.980191043
・ログの出力
画像を質問文に追加しました。
・何かしらのエラーメッセージが出たかどうか
エラーは何も出ておりません。
遷移先のURLは、記事の詳細画面(/questions/:id)を想定しているのですが、記事の一覧画面に遷移してしまいます。