2015-06-25 112 views
-1

我想用Rails 4和簡單的窗體來製作應用程序。Rails:嵌套屬性的編輯路徑

我有3個模型:project,project_question和project_answer。

的關聯是: Project.rb:

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

項目問題:

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 

在我的項目問題查看部分,我嘗試顯示項目答案。如果項目創建者是當前用戶,我想放置一個鏈接來編輯答案。我已經嘗試了至少10個路徑變體,我仍然無法弄清楚如何鏈接到編輯project_answer路徑。

我的項目答案航線有:

project_project_question_project_answers GET  /projects/:project_id/project_questions/:project_question_id/project_answers(.:format)   project_answers#index 
               POST  /projects/:project_id/project_questions/:project_question_id/project_answers(.:format)   project_answers#create 
    new_project_project_question_project_answer GET  /projects/:project_id/project_questions/:project_question_id/project_answers/new(.:format)  project_answers#new 
edit_project_project_question_project_answer GET  /projects/:project_id/project_questions/:project_question_id/project_answers/:id/edit(.:format) project_answers#edit 
     project_project_question_project_answer GET  /projects/:project_id/project_questions/:project_question_id/project_answers/:id(.:format)  project_answers#show 
               PATCH /projects/:project_id/project_questions/:project_question_id/project_answers/:id(.:format)  project_answers#update 
               PUT  /projects/:project_id/project_questions/:project_question_id/project_answers/:id(.:format)  project_answers#update 
               DELETE /projects/:project_id/project_questions/:project_question_id/project_answers/:id(.:format)  project_answers#destroy 

我project_question部分是:

<div class="containerfluid"> 
    <div class="row"> 
    <div class="col-md-12"> 
     <% @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 && singleQuestion.project_answer.try(:answer).blank? %> 

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

         <div class="datasubtextq"> 
         <%=singleQuestion.project_answer.try(:answer) %> 
         <span class="editproject"> 
          <%= link_to 'Edit Answer', [@project_answer.project_question, @project_answer] %> 
         </span> 

         </div> 

       <% else %> 
        <div class="datasubtextq"> 
         <%=singleQuestion.project_answer.try(:answer) %> 

        </div> 
      <% end %> 
          <% end %> 

      </span> 
     <% end %> 

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

,我試圖弄清楚該生產線是:

<%= link_to 'Edit Answer', [@project_answer.project_question, @project_answer] %> 

我試過這個是因爲我在http://blog.8thcolor.com/en/2011/08/nested-resources-with-independent-views-in-ruby-on-rails/找到了一個教程。雖然該博客中的編輯示例使用單獨的文件來解答我的答案,但我認爲也許改變對象的順序可能會有所幫助。它沒有。

我也曾嘗試:

     <%= link_to 'Edit Answer',[@project_answer.singleQuestion, @project_answer] %> 

         <%= link_to 'Edit Answer', edit_project_project_question_project_answer_path(@project_answer.singleQuestion, @project_answer) %> 

         <%= link_to 'Edit Answer', edit_project_project_question_project_answer_path(@singleQuestion.project_answer, @project_answer) %> 
         <%= link_to 'Edit Answer', edit_project_project_question_project_answer_path(@project_answer.project_question, @project_answer) %> 

如何鏈接到項目答案編輯路徑時,認爲部分項目的問題裏面顯示項目的答案嗎?

我project_answer控制器具有:

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 

我認爲這是在URL中的線索,當我點擊了鏈接,「編輯答案」顯示。該頁面本身是空白的。 url是唯一的project/id/project_question/id。我期待項目答案ID也在這一行。

我嘗試在包含項目答案的url欄中輸入一個url,並且出現路徑錯誤(即使答案顯示在我的顯示頁面上)。

我試圖在我的項目控制檯中找到答案。我得到的錯誤說:

p.project_questions.project_answers.find 
NoMethodError: undefined method `project_answers' for #<ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_ProjectQuestion:0x00000104382e08> 

我已經嘗試過同樣的搜索沒有pluralised表名稱。

+0

請把你的'project_questions_controller' – Pavan

回答

1

你沒有定義表單內的@project_answer變量,所以你不能使用它。

你應該使用...

<%= link_to 'Edit Answer', edit_project_project_question_project_answer_path(@project, singleQuestion, singleQuestion.project_answer) %> 
+0

嗨史蒂夫,我試過了,但我得到了同樣的結果。空白頁面的網址也是:http:// localhost:3000/projects/70/project_questions/28(不參考項目答案) – Mel

+0

答案是否存在?如果沒有,你應該調用新的路徑而不是編輯路徑。 – SteveTurczyn

+0

嗨史蒂夫,是的,答案是存在的。我正在編輯它。 – Mel

1
edit_project_project_question_project_answer GET /projects/:project_id/project_questions/:project_question_id/project_answers/:id/edit(.:format) project_answers#edit 

你必須給出:project_id也獲得鏈接的工作價值。

這應該工作

<%= link_to 'Edit Answer', edit_project_project_question_project_answer_path(@project, singleQuestion, @project_answer) %> 
+0

鏈接的作品,但它不走的答案部分 – Mel

+0

@ user2860931如果你花了什麼? – Pavan

+0

只是一個空白的白頁,沒有應用程序佈局或任何東西。有點奇怪。 – Mel