Rails: Couldn`t find #controller with ID of

血红的双手。 提交于 2019-12-11 14:28:57

问题


When submitting an answer I get this error:

ActiveRecord::RecordNotFound (Couldn't find Question with ID=answer):
  app/controllers/questions_controller.rb:6:in `show'

From what I understand I either made a error with passing an argument from the form or didn`t define it correctly in my controller.

Would appreciate some help finding this bug, thanks in advance!

Questions_Controller:

class QuestionsController < ApplicationController
  def index
  end

  def show
      @question = Question.find(params[:id])
      @choices = @question.choices
  end

  def answer
      @choice = Choice.find(:first, :conditions => { :id => params[:id] })
      @answer = Answer.create(:question_id => @choice.question_id, :choice_id => @choice.id)

      if Question.last == @choice.question
        render :action => "thank_you"
      else
        question = Question.find(:first, :conditions => { :position => (@choice.question.position + 1) })
        redirect_to question_path(:id => question.id)
      end
   end
end

views/questions/show.html.erb :

<div data-role="content">
  <div align="center">
    <h3><%= @question.question %></h3>
  </div>
  <br><br>
  <ul data-role="listview">
    <% @choices.each_with_index do |c, i| %>
      <% i = i + 1 %>
      <li data-theme="c">
        <%= link_to "#{i}. #{c.choice}", answer_questions_path(:id => c.id) %>
      </li>
    <% end %>
  </ul>
</div>

::EDIT::

This happens when I try to select a choice & submit an answer while on the first question.

Started GET "/questions/1" for 127.0.0.1 at Thu Dec 01 01:38:36 -0500 2011
  Processing by QuestionsController#show as 
  Parameters: {"id"=>"1"}
  SQL (0.6ms)   SELECT name
 FROM sqlite_master
 WHERE type = 'table' AND NOT name = 'sqlite_sequence'
  Question Load (0.3ms)  SELECT "questions".* FROM "questions" WHERE "questions"."id" = 1 LIMIT 1
  Choice Load (10.8ms)  SELECT "choices".* FROM "choices" WHERE ("choices".question_id = 1)
Rendered questions/show.html.erb within layouts/application (28.8ms)
Completed 200 OK in 424ms (Views: 118.0ms | ActiveRecord: 11.6ms)


Started GET "/questions/answer?id=1" for 127.0.0.1 at Thu Dec 01 01:38:38 -0500 2011
  Processing by QuestionsController#show as 
  Parameters: {"id"=>"answer"}
  Question Load (0.1ms)  SELECT "questions".* FROM "questions" WHERE "questions"."id" = 0 LIMIT 1
Completed   in 10ms

ActiveRecord::RecordNotFound (Couldn't find Question with ID=answer):
  app/controllers/questions_controller.rb:6:in `show'

Hope this helps.


回答1:


My best guess is that you don't have a route correctly setup. Assuming that you're using Rails 3 and you're using resources, you need to do add the following:

resources :questions do 
  member do
     put 'answer'
  end
end

This will create a route like /questions/#{id}/answer.

Answer is not an HTTP verb, so using resources in your routes will not create a route to your answer action.

Edit based on comment:

First, if you're updating or creating data, you should use put or post. It's a bad idea to modify data on the server with a get. Secondly, I assume that you would be doing an answer per question. If that is the case, you should do the action on a member, not a collection. Also, in your answer action, you have params[:id]. You won't get params[:id] if you try to do an action on a collection rather than a member.



来源:https://stackoverflow.com/questions/8337396/rails-couldnt-find-controller-with-id-of

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!