簡體   English   中英

Rails鏈接路徑

[英]Rails link_to path

我正在嘗試在Rails 4中制作一個應用程序。

我有3個模型:Project,Project_Question,Project_Answer

關聯是:

項目:

has_many :project_questions 

並接受項目問題的嵌套屬性。

項目問題:

belongs_to :project
has_one :project_answer 

並接受“項目答案”的嵌套屬性。

我的路線嵌套如下:

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

在我的“項目問題”部分中,我想要一個鏈接來回答問題。 我試過了:

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

我的路線文件中有一個具有該名稱的路線,但出現此錯誤消息:

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

括號中應該包含什么?

視圖:

<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>

項目問題控制器:

  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

當您運行rake routes ,您會發現這一條

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

這意味着它需要:project_id:project_question_id作為鍵。

這應該工作

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

請注意, new_project_project_question_project_answer_path不是new_project_project_questions_project_answer_path

您的link_to應該在下面

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

視圖將如下所示

 <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>

檢查參數

 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

project_id

並且您沒有在link_to傳遞它,因此它出現了新錯誤, missing required keys: [:project_id]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM