

問題モデルの指定したレコードとカラムをランダムにビューに表示し、テキストエリアに答えを入力した後に、先程指定したレコードの答えカラムと入力した答えを照合することで、正解か不正解をフラッシュメッセージを出すようにしたいです。

現在、指定したレコードとカラムをランダムにビューに表示し、テキストエリアに答えを入力ができますが、照合しようとすると、"Couldn't find
Problem without an ID" というエラーが出ます。

ランダムに表示したレコードのidと照合しようしたidが一致しなくて困っています。  
どうかご教授願います。

こちらがコードになります。

controller

[code]

    class ProblemsController < ApplicationController
      before_action :logged_in_user
      before_action :correct_user, only: %i[edit update]
    
      def show
        @problem = Problem.find(params[:id])
      end
    
      def new
        @problem = Problem.new
      end
    
      def create
        @problem = current_user.problems.build(problem_params)
        @problem.picture.attach(params[:problem][:picture])
        if @problem.save
          flash[:success] = '問題が作成されました！'
          redirect_to problem_path(@problem)
        else
          render 'problems/new'
        end
      end
    
      def edit
        @problem = Problem.find(params[:id])
      end
    
      def update
        @problem = Problem.find(params[:id])
        if @problem.update(problem_params)
          flash[:succcess] = '問題情報が更新されました！'
          redirect_to @problem
        else
          render 'edit'
        end
      end
    
      def destroy
        @problem = Problem.find(params[:id])
        if current_user.admin? || current_user?(@problem.user)
          @problem.destroy
          flash[:success] = '問題が削除されました'
          redirect_to request.referer == user_url(@problem.user) ? user_url(@problem.user) : root_url
        else
          flash[:danger] = '別アカウントの問題は削除できません'
          redirect_to root_url
        end
      end
    
      def random
        @problem = Problem.offset( rand(Problem.count)).take
      end
    
      def answer
        @problem = Problem.find(params[:id])
      
        if @problem.answer == params[:problem][:answer]
          flash.now[:notice] = "当たり"
        else
          flash.now[:notice] = "はずれ"
        end
        
        render :random
      end
    
      private
    
        def problem_params
          params.require(:problem).permit(:study_type, :title, :explanation_text, :problem_text, :answer, :problem_explanation, :taget_age, :reference, :picture)
        end
    
        def correct_user
          # 現在のユーザーが更新対象の問題を保有しているかどうか確認
          @problem = current_user.problems.find_by(id: params[:id])
          redirect_to root_url if @problem.nil?
        end
    end
    
[/code]

view

[code]

    <% provide(:title, "問題出題") %>
    <div class="container">
        <div class="row">
          <%= form_with model: @problem, url: {controller: 'problems', action: 'answer'} do |f| %>
            <%= f.hidden_field :id %>
            <div><%= @problem.study_type %></div><br>
            <div><%= @problem.explanation_text %></div><br>
            <div><%= @problem.problem_text %></div><br>
            <%= f.text_field :answer, value: "" %>
            <%= f.submit "回答", class: "btn btn-primary" %>
            <%= link_to "次の問題へ", problems_random_path%>
          <% end %>
        </div>
    
[/code]

routes

[code]

      get "/problems/random", to: "problems#random"
      patch '/problems/random', to: 'problems#answer'
      resources :problems
    
[/code]


CC BY-SA 4.0
2021-12-08T22:04:23.363
84034
2022-08-18T16:15:20.860
2021-12-09T00:06:11.153
3060
47983
question
ruby-on-rails ruby
rails6 指定したレコードのIDと照合したいIDを一致させたい


pathに@problemのidが入っていないことが原因かと思います  
以下のようにしてpathにidを含めればviewの `<%= f.hidden_field :id %>`も必要ありません

**route.rb**

[code]

    resources :problems do
      get :random, on: :collection
      patch :random, to: 'problems#answer', on: :member
    end
    
[/code]

**rails routes 結果**

[code]

                                                      Prefix Verb   URI Pattern                                                                                        Controller#Action
                                             random_problems GET    /problems/random(.:format)                                                                         problems#random
                                              random_problem PATCH  /problems/:id/random(.:format)                                                                     problems#answer
                                                    problems GET    /problems(.:format)                                                                                problems#index
                                                             POST   /problems(.:format)                                                                                problems#create
                                                 new_problem GET    /problems/new(.:format)                                                                            problems#new
                                                edit_problem GET    /problems/:id/edit(.:format)                                                                       problems#edit
                                                     problem GET    /problems/:id(.:format)                                                                            problems#show
                                                             PATCH  /problems/:id(.:format)                                                                            problems#update
                                                             PUT    /problems/:id(.:format)                                                                            problems#update
                                                             DELETE /problems/:id(.:format)                                                                            problems#destroy
    
[/code]

**view**

[code]

    <%= form_with model: @problem, url: random_problem_path(@problem), method: :patch do |f| %>
    
[/code]

参考  
<https://railsguides.jp/routing.html>


CC BY-SA 4.0
2022-08-18T16:15:20.860
90618
2022-08-18T16:15:20.860
54050
84034
answer