2016-04-28 60 views
0

我試圖鏈接以添加編輯測驗鏈接我的Rails應用程序,但我得到這個錯誤:沒有路線匹配{:action =>「edit」,:controller =>「quiz_bs」,:id => nil}缺少必需的鍵:[:id]

No route matches {:action=>"edit", :controller=>"quiz_bs", :id=>nil} missing required keys: [:id] 

我已經看過類似的帖子(like this one),但他們的答案似乎並沒有解決問題,即使他們提出類似的情況。

錯誤是出現了此行的我application.html.erb代碼:

<li> 
    <% if @user.quiz_bs == nil %> 
     <%= link_to "Body Structure Quiz", quiz_bs_path %> 
    <% else %> 
     <%= link_to "Body Structure Quiz ✓", edit_quiz_b_path(id: @user.quiz_bs) %> 
    <% end %> 
    </li> 

但鏈接也將是我的節目的用戶頁面上:

<h4>Body Structure</h4> 
    <% if @user.quiz_bs == nil %> 
    <p><%= link_to "Test Your Body Structure", new_quiz_b_path %></p> 
    <% else %> 
    <h3><%= @user.quiz_bs.bscode %></h3> 
    <p><%= link_to "Retest Results", edit_quiz_b_path(id: @quiz_bs.id) %></p> 
    <% end %> 

這裏是我的quiz_bs_controller

class QuizBsController < ApplicationController 
before_action :require_sign_in 

def show 
    @quiz_bs = QuizBs.find(params[:id]) 
end 

def new 
    @quiz_bs = current_user.quiz_bs || current_user.build_quiz_bs 
end 

def create 
    @quiz_bs = QuizBs.new 

    @quiz_bs.bs01 = params[:quiz_bs][:bs01] 
    @quiz_bs.bs02 = params[:quiz_bs][:bs02] 
    @quiz_bs.bs03 = params[:quiz_bs][:bs03] 
    @quiz_bs.bs04 = params[:quiz_bs][:bs04] 
    @quiz_bs.bs05 = params[:quiz_bs][:bs05] 
    @quiz_bs.bs06 = params[:quiz_bs][:bs06] 

    @quiz_bs.user = current_user 

if @quiz_bs.save 
    flash[:notice] = "Quiz results saved successfully." 
    redirect_to user_path(current_user) 
else 
    flash[:alert] = "Sorry, your quiz results failed to save." 
    redirect_to welcome_index_path 
end 
end 

def edit 
@quiz_bs = QuizBs.find(params[:id]) 

@quiz_bs.assign_attributes(quiz_bs_params) 

if @quiz_bs.save 
    flash[:notice] = "Post was updated successfully." 
    redirect_to user_path(current_user) 
else 
    flash.now[:alert] = "There was an error saving the post. Please try again." 
    redirect_to welcome_index_path 
end 
end 

def update 
@quiz_bs = QuizBs.find(params[:id]) 

@quiz_bs.assign_attributes(quiz_bs_params) 

if @quiz_bs.save 
    flash[:notice] = "Post was updated successfully." 
    redirect_to user_path(current_user) 
else 
    flash.now[:alert] = "There was an error saving the post. Please try again." 
    redirect_to welcome_index_path 
end 
end 

private 
def quiz_bs_params 
params.permit(:bs01, :bs02, :bs03, :bs04, :bs05, :bs06) 
end 

end 

而相應的路線是:

 quiz_bs GET /quiz_bs(.:format)    quiz_bs#index 
       POST /quiz_bs(.:format)    quiz_bs#create 
    new_quiz_b GET /quiz_bs/new(.:format)   quiz_bs#new 
    edit_quiz_b GET /quiz_bs/:id/edit(.:format) quiz_bs#edit 
     quiz_b GET /quiz_bs/:id(.:format)   quiz_bs#show 
       PATCH /quiz_bs/:id(.:format)   quiz_bs#update 
       PUT /quiz_bs/:id(.:format)   quiz_bs#update 

我會很感激任何幫助找出問題在這裏!

+0

'<%= link_to「Body Structure Quiz✓」,edit_quiz_b_path(id:@quiz_bs.id)%>' – 7urkm3n

+0

在application.html.erb頁面中,@quiz_bs的值爲零,因爲它給出了錯誤 –

+0

請注意:'edit'方法不應該做任何處理,它只是負責渲染頁面。所以,你只需要'@quiz_bs = QuizBs.find(params [:id])',就這些了。 – GoGoCarl

回答

1

application.html.erb,更改爲:

<li> 
    <% if current_user.quiz_bs.nil? %> 
     <%= link_to "Body Structure Quiz", quiz_bs_path %> 
    <% else %> 
     <%= link_to "Body Structure Quiz ✓", edit_quiz_b_path(current_user.quiz_bs) %> 
    <% end %> 
    </li> 
  • 我們希望改變@usercurrent_user,因爲這種觀點是整個網站的模板。無法保證@user將成爲每個控制器中的全局變量(並且這可能不是您想要的)。使用current_user方法將始終可用,並讓您登錄的用戶。
  • 注意:id:這裏沒有必要,通過的模型將被用作id。

users/show.html.erb,更改爲:

<h4>Body Structure</h4> 
    <% if @user.quiz_bs == nil %> 
    <p><%= link_to "Test Your Body Structure", new_quiz_b_path %></p> 
    <% else %> 
    <h3><%= @user.quiz_bs.bscode %></h3> 
    <p><%= link_to "Retest Results", edit_quiz_b_path(@user.quiz_bs) %></p> 
    <% end %> 
  • @quiz_b是,你就不會在你的users_controller定義就像你在做quiz_bs_controller一個變量。您正在訪問@user.quiz_bs,因此您想要鏈接到代碼中的特定實例。

全球@quiz_b只適用於您定義此變量的頁面,該頁面可能是quiz_b路徑下的任何頁面。

最後,在quiz_bs_controller

def quiz_bs_params 
    params.require(:quiz_bs).permit(:bs01, :bs02, :bs03, :bs04, :bs05, :bs06) 
end 

當與形式的結合使用這種方法聲明爲:

<%= form_for @quiz_bs do |f| %> 

您需要要求您params:quiz_bs爲了範圍的參數該模型正在編輯中;在這種情況下,@quiz_bs。否則,在更新/創建測驗時不會找到變量。

+0

我仍然在參考'application.html.erb'頁面上的鏈接時遇到了一個錯誤(不幸的是,我認爲它甚至不能到達用戶顯示頁面),但是通過這個改變的鏈接,錯誤從連接到'<%if user.quiz_bs == nil%>'行的鏈接,表示'未定義的方法'quiz_bs'爲nil:NilClass'。 – Liz

+0

而且我爲應用程序視圖添加了更多的上下文。 – Liz

+0

@利茲我更新了我的答案。但是,有一件事 - 用戶可以有多個quiz_b嗎? – GoGoCarl

0

這裏是你的問題:

No route matches {:action=>"edit", :controller=>"quiz_bs", :id=>nil} missing required keys: [:id] 

你要通過編輯操作的ID,它的路由結構的一部分。在你的路由輸出它甚至可以顯示你:

/quiz_bs/:id/edit 

沒有這個ID,在/:ID /編輯路線是根本行不通的 - 這是Rails機制。

在你的Gemfile:

group :development do 
    gem 'pry-rails' 
end 

和:

bundle install 
application.html.erb這種邏輯上面

然後做:

<% binding.pry %> 
<% if @user.quiz_bs == nil %> 
    <p><%= link_to "Test Your Body Structure", new_quiz_b_path %></p> 
<% else %> 
    <h3><%= @user.quiz_bs.bscode %></h3> 
    <p><%= link_to "Retest Results", edit_quiz_b_path(id: @quiz_bs.id) %></p> 
<% end %> 

現在,再次點擊頁面。 Pry將產生一個調試斷點,這將允許您評估服務器當前正在運行的終端中的@user對象。我對你最好的建議是學習調試你自己的代碼 - 這是一個情境,有很多你不能提供訪問你的應用程序不能提供的上下文。

相關問題