Rails link_to路径

时间:2015-06-22 11:10:19

标签: ruby-on-rails

我正在尝试在Rails 4中创建一个应用程序。

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

协会是:

项目:

has_many :project_questions 

并接受项目问题的嵌套属性。

项目问题:

belongs_to :project
has_one :project_answer 

并接受Project Answers的嵌套属性。

我的路线嵌套如下:

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

2 个答案:

答案 0 :(得分:1)

当你运行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

答案 1 :(得分:0)

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

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

project_id

并且您未在link_to 中传递它,因此它发生了新的错误missing required keys: [:project_id]