2015-06-22 5 views
0

Я пытаюсь сделать приложение в Rails 4.Rails link_to путь

У меня есть 3 модели: Project, Project_Question, Project_Answer

Ассоциации являются:

Проект:

has_many :project_questions 

и принимает вложенные атрибуты для вопросов проекта.

Вопрос проекта:

belongs_to :project 
has_one :project_answer 

и принимает вложенные атрибуты для проекта 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 
+0

Что-то вы определили. Есть ли какая-либо переменная в вашем представлении с экземпляром «ProjectQuestion»? –

+3

'new_project_project_question_project_answer_path' yuck ... – max

+0

Я не знаю, что это значит? У меня есть атрибут в каждой из моих моделей, называемый: id и атрибут в каждой из моделей belongs_to, у которых есть parent_id. Я подумал, что именно поэтому я должен использовать идентификатор вопроса проекта. – Mel

ответ

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

+0

Привет Паван, я попробовал это предложение, но я получаю эту ошибку: неопределенный метод 'new_project_project_questions_project_answer_path» для # <# <Класс: 0x0000010742b9d8>: 0x000001074400e0> – Mel

+0

@ user2860931 '' new_project_project_question_project_answer_path' не new_project_project_questions_project_answer_path' – Pavan

+0

Большое спасибо Паван – Mel

0

Ваше link_to должно быть что-то ниже

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

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 => 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 так thwos новая ошибка missing required keys: [:project_id]

+0

, когда я пытаюсь: <% = link_to 'Ответить на этот вопрос', new_project_project_question_project_answer_path (: project_question_id => singleQuestion.id)%> Я получаю эту ошибку: нет маршрутов, совпадающих с {: action => "new",: controller => "project_answers",: id => "70",: project_question_id => 27} Отсутствуют необходимые ключи: [: project_id] – Mel

+0

Когда я пытаюсь использовать множественные «вопросы» в пути, я получаю эту ошибку: undefined method 'new_project_project_questions_project_answer_path 'для # <# <Класс: 0x0000010742b9d8>: 0x0000010f09b978> – Mel

+0

Также отправьте код контроллера –

Смежные вопросы