Mel
Mel

Reputation: 2685

Rails link_to path

I am trying to make an app in Rails 4.

I have 3 models: Project, Project_Question, Project_Answer

The associations are:

Project:

has_many :project_questions 

and accepts nested attributes for project questions.

Project Question:

belongs_to :project
has_one :project_answer 

and accepts nested attributes for Project Answers.

My routes are nested as follows:

resources :projects do
  resources :project_questions do
    resources :project_answers
  end
end

In my Project Questions partial, I want a link to answer the question. I've tried:

  <%= link_to 'Answer this question', new_project_project_question_project_answer_path(:project_question_id => project_question.id) %>

I have a route with that name in my routes file, but I'm getting this error message:

undefined local variable or method `project_question' for #<#<Class:0x0000010742b9d8>:0x0000010f810b68>

What should go in the brackets?

View:

<div class="containerfluid">
  <div class="row">
    <div class="col-md-10 col-md-offset-1">
      <% @project.project_questions.each do |singleQuestion| %>

          <div class="categorytitle">
            <%= singleQuestion.title %>

          </div>
          <div class="generaltext">
            <%= singleQuestion.try(:content) %>
          </div>
          <span class="editproject">
            <% if current_user.id == @project.creator_id %>
              <%= link_to 'Answer this question', new_project_project_questions_project_answer_path(:project_question_id => project_question.id) %>

            <% end %>
          </span>
      <% end %>

    </div>
  </div>
</div>

Project Question controller:

  class ProjectQuestionsController < ApplicationController
      before_action :set_project_question, only: [:show, :edit, :update, :destroy]

      # GET /project_questions
      # GET /project_questions.json
      def index
        @project_questions = ProjectQuestion.all
      end

      # GET /project_questions/1
      # GET /project_questions/1.json
      def show


      end

      # GET /project_questions/new
      def new
        @project_question = ProjectQuestion.new
        @project = Project.find(params[:project_id])
        # @project_id = params[:project_id]
        @project_question.project_answers[0] = ProjectAnswer.new

      end

      # GET /project_questions/1/edit
      def edit
      end

      # POST /project_questions
      # POST /project_questions.json
      def create
        @project_question = ProjectQuestion.new(project_question_params)
        @project_question.project_id = project_question_params[:project_id]


        respond_to do |format|
          if @project_question.save
            format.html { redirect_to project_url(Project.find(project_question_params[:project_id])), notice: 'Project question was successfully created.' }
            format.json { render action: 'show', status: :created, location: @project_question }
          else
            format.html { render action: 'new' }
            format.json { render json: @project_question.errors, status: :unprocessable_entity }
          end
        end
      end

      # PATCH/PUT /project_questions/1
      # PATCH/PUT /project_questions/1.json
      def update
        respond_to do |format|
          if @project_question.update(project_question_params)
            format.html { redirect_to @project_question, notice: 'Project question was successfully updated.' }
            format.json { head :no_content }
          else
            format.html { render action: 'edit' }
            format.json { render json: @project_question.errors, status: :unprocessable_entity }
          end
        end
      end

      # DELETE /project_questions/1
      # DELETE /project_questions/1.json
      def destroy
        @project_question.destroy
        respond_to do |format|
          format.html { redirect_to project_questions_url }
          format.json { head :no_content }
        end
      end

      private
        # Use callbacks to share common setup or constraints between actions.
        def set_project_question
          @project_question = ProjectQuestion.find(params[:id])
        end

        # Never trust parameters from the scary internet, only allow the white list through.
        def project_question_params
          params[:project_question].permit(:id, :title, :content, :project_id, :user_id,
          project_answer_atttibutes: [:id, :answer, :project_question_id, :user_id]
          )
        end
    end

Upvotes: 1

Views: 9009

Answers (2)

Rajarshi Das
Rajarshi Das

Reputation: 12320

Your link_to should be something below

 <%= link_to 'Answer this question', new_project_project_questions_project_answer_path(:project_id => @project.id, :project_question_id => singleQuestion.id) %>

View will look like below

 <div class="containerfluid">
  <div class="row">
    <div class="col-md-10 col-md-offset-1">
      <% @project.project_questions.each do |singleQuestion| %>

          <div class="categorytitle">
            <%= singleQuestion.title %>

          </div>
          <div class="generaltext">
            <%= singleQuestion.try(:content) %>
          </div>
          <span class="editproject">
            <% if current_user.id == @project.creator_id %>
              <%= link_to 'Answer this question', new_project_project_questions_project_answer_path(:project_question_id => singleQuestion.id) %>

            <% end %>
          </span>
      <% end %>

    </div>
  </div>
</div>

Check that params

 def project_question_params
   params[:project_question].permit(:id, :title, :content, :project_id, :user_id,
          project_answer_atttibutes: [:id, :answer, :project_question_id, :user_id]
          )
  end

There is project_id

and you did not pass it in link_to so it thwos new errormissing required keys: [:project_id]

Upvotes: 0

Pavan
Pavan

Reputation: 33542

When you run rake routes, you will find this one

new_project_project_question_project_answer GET  /projects/:project_id/project_questions/:project_question_id/project_answers/new(.:format)      project_answers#new

That means it requires :project_id and :project_question_id as keys.

This should work

<%= link_to 'Answer this question', new_project_project_question_project_answer_path(:project_id => @project.id, :project_question_id => singleQuestion.id) %>

Notice new_project_project_question_project_answer_path not new_project_project_questions_project_answer_path

Upvotes: 2

Related Questions