2015-06-25 114 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