2015-06-25 4 views
1

Я пытаюсь создать приложение с Rails 4 и Simple Form.Rails: Как визуализировать вложенные частичные

У меня есть модель проектов, модель project_questions и модель ответа проекта.

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

Project.rb:

has_many :project_questions, dependent: :destroy#, through: :projects 
    accepts_nested_attributes_for :project_questions 

Project_question.rb: answer.rb

belongs_to :project#, counter_cache: true 
    has_one :project_answer, dependent: :destroy 
    belongs_to :user 
    accepts_nested_attributes_for :project_answer 

Проект:

belongs_to :project_questions#, counter_cache: true 
    belongs_to :user 

Мои маршруты вложенными :

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

В моем проектном шоу представлено частичное, чтобы задать вопросы о проекте.

<%= render 'project_questions/pqps' %> 

Внутри этого проекта-вопрос парциальные (pqps), я пытаюсь сделать проект отвечает частичный, так что ответ находится под вопросом.

<% @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_question_project_answer_path(:project_id => @project.id, :project_question_id => singleQuestion.id) %> 
<% else %> 
      <%= render 'project_answers/answers' %> 

<% end %> 

Я изо всех сил, потому что код, который я имею в частичном виде project_answer является:

 <%= @project.project_questions.project_answers.answer %> 

Когда я пытаюсь это, я получаю эту ошибку:

undefined method `project_answers' for #`<ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_ProjectQuestion:0x000001039ebcc8>` 

У меня есть пробовал все формы и комбинации плюрализации разных бит этой строки ответа на проект, но ничего не работает.

Когда я пытаюсь ответить как: <% = @ project.project_questions.project_answer.answer%>

undefined method `project_answer' for #<ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_ProjectQuestion:0x00000102b59318> 

Я не понимаю, почему это так.

В моем проекте контроллера ответ, у меня есть:

class ProjectAnswersController < ApplicationController 
    before_action :set_project 
    before_action :set_project_question 
    before_action :set_project_answer, only: [:show, :edit, :update, :destroy] 


    # GET /project_answers 
    # GET /project_answers.json 
    def index 
    @project_answers = ProjectAnswer.all 
    end 

    # GET /project_answers/1 
    # GET /project_answers/1.json 
    def show 
    end 

    # GET /project_answers/new 


    def new 
    @project_answer = @project_question.build_project_answer 
    end 

    # GET /project_answers/1/edit 
    def edit 
    end 

    # POST /project_answers 
    # POST /project_answers.json 
    def create 
    @project_answer = @project_question.build_project_answer(project_answer_params) 


    respond_to do |format| 
     if @project_answer.save 
     format.html { redirect_to @project, notice: 'Project answer was successfully created.' } 
     format.json { render action: 'show', status: :created, location: @project_answer } 
     else 
     format.html { render action: 'new' } 
     format.json { render json: @project_answer.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

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

    # DELETE /project_answers/1 
    # DELETE /project_answers/1.json 
    def destroy 
    @project_answer.destroy 
    respond_to do |format| 
     format.html { redirect_to project_answers_url } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 

    def set_project 
     @project = Project.find(params[:project_id]) 
    end 

    def set_project_question 
     @project_question = @project.project_questions.find(params[:project_question_id]) 
    end 


    def set_project_answer 
     @project_answer = ProjectAnswer.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def project_answer_params 
     params[:project_answer].permit(:answer, :project_question_id, :id) 
    end 
end 

Я думал, что должно было позволить мне просто использовать @ project.answer.answer, но я также попробовал, что и оно не работает.

Может ли кто-нибудь увидеть, что мне нужно сделать, чтобы дать ответ на вопрос?

ответ

0

Если вы правильно прочитать вашу ошибку

undefined method project_answers' for 
#<ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_ProjectQuestion:0x000001039ebcc8> 

Он clearyly утверждает, что вы звоните project_answers на коллекции, а не одну запись.Также у вас есть 1-1 ассоциации на моделях ProjectQuestion и ProjectAnswer поэтому он должен быть project_answer и не project_answers

Fix:

В зависимости от HTML внутри вашей парциальное вы можете использовать любой из них:

<%= render partial: 'project_answers/answers', locals: {some_local_variable_used_in_partial: singleQuestion.project_answer} %> 

Для получения дополнительной информации ознакомьтесь с using partials

Edit:

Вы по-прежнему вызываете project_answer в коллекции. Вам нужно выполнить итерацию над project_questions, а затем отобрать ответы для нее. Внутри частичного вам необходимо:

<% @project.project_questions.each do |question| %> 
    <%= question.project_answer.answer %> 
<% end %> 
+0

Спасибо Mandeep. Я ценю, что вы пытаетесь помочь. У каждого вопроса есть только 1 ответ. Я не понимаю, как может быть коллекция для этой ассоциации. Спасибо, в любом случае. – Mel

+0

Когда я попробую ваше второе предложение (попробовав каждый ответ и ответы), я получаю эту ошибку: undefined method 'question_answer 'для # Mel

+0

@ user2860931 мой плохой, вы использовали метод project_answers, так что считали, что это 1- N отношений. Обновлен мой ответ. – Mandeep

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