前提・実現したいこと
railsで投票アプリを開発中です。
ラジオボタンで回答を一つ選び投票をする機能を実装したいと考えています。
誰がどの質問にどの回答を選んだのかが分かるように、
voteテーブルには、user_id, question_id, answer_idの3つの値が
入ることを想定しています。
解決したい問題
下記のソースにより、回答を一つ選び、投票してもvoteテーブルに値が入りません。
どこに問題があり、どのようなソースが適切か、ご教授いただけると幸いです。
model
vote.rb
ruby
1class Vote < ApplicationRecord 2 belongs_to :user 3 belongs_to :question 4 belongs_to :answer 5end
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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/13 01:10