Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

retrieve current parameter value in Rails controller – Error: Couldn't find Question without an ID

Upon clicking delete I want my page to redirect to the current user’s poll. This something like this.
questions_controller.rb:

  def destroy
    @poll_id = Question.find(param[:poll_id])
    @question.destroy

    respond_to do |format|
      format.html { redirect_to user_poll_url(current_user.id, @question.poll_id), notice: "Question was successfully destroyed." }
      format.json { head :no_content }
    end
  end

The Questions_controller’s content is the same as the rails generated with the exception of the above change.

the question_controller has the poll_id as a paramter. How do I retrieve it’s current value to use for redirection.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

def question_params
  params.require(:question).permit(:poll_id, :title, :description)
end

routes.rb

  resources :users do
    resources :polls
  end
  resource :polls do
    resources :questions 
  end

The error i’m getting is:

ActiveRecord::RecordNotFound in QuestionsController#destroy
Couldn't find Question without an ID

Extracted source (around line #52):           
  # DELETE /questions/1 or /questions/1.json
  def destroy
    @poll_id = Question.find(param[:poll_id])
    session[:return_to] ||= request.referer
    @question.destroy

with line 52 being @poll_id = Question.find(param[:poll_id])

>Solution :

param[:poll_id] is not correct. You always get these attributes in the controller in the method named params and as we submit a form from the front end Rails maps them to a specific key (name of the model singular), for example, to get the poll_id you need to use:

question_params[:poll_id]

which is equivalent to:

params[:question][:poll_id]

Also not sure if you poll_id would equal to the id saved in questions table. The find method would always find by id which means that:

Question.find(param[:poll_id])

means

SELECT * FROM questions WHERE id = param[:poll_id]

So if poll_id is equivalent to id then that is fine or you may want to replace find by find_by or you can also use params[:id] instead of poll_id if that exists (depends on your routes).

More information here on params: https://edgeguides.rubyonrails.org/action_controller_overview.html#parameters

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading