2016-04-28 7 views
0

Ich versuche zu verlinken, um einen Edit Quiz Link hinzuzufügen mein Schienen-app, aber sie immer diese Fehlermeldung:Keine Route stimmt überein {: action => "edit",: controller => "quiz_bs",: id => nil} fehlender Schlüssel: [: id]

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

ich habe auf ähnlichen Beiträge sehe (like this one), aber ihre Antworten scheinen nicht das Problem zu lösen, auch wenn sie ähnliche Situationen präsentieren. wird auch auf meiner Show Benutzer Seite

<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> 

aber der Link sein: für diese Linie meiner application.html.erb Code

Der Fehler wird erscheinen

<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 %> 

Hier ist meine 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 

Und die entsprechenden Routen sind:

 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 

Ich wäre so dankbar für jede Hilfe, um das Problem hier herauszufinden! ändern

+0

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

+0

In der application.html.erb Seite ist der Wert von @quiz_bs null, weil es den Fehler –

+0

gibt Nur eine Anmerkung: Die 'edit' Methode sollte keine Verarbeitung machen, sondern ist nur für das Rendern der Seite zuständig. Also, Sie wollen nur '@quiz_bs = QuizBs.find (params [: id])' und das ist alles. – GoGoCarl

Antwort

1

In application.html.erb an:

<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> 
  • Wir wollen @user-current_user ändern, da diese Ansicht eine Vorlage für die gesamte Website. Es gibt keine Garantie, dass @user eine globale Variable in jedem einzelnen Controller sein wird (und das ist wahrscheinlich nicht, was Sie hier sowieso wollen). Die Verwendung der current_user Methode wird immer verfügbar sein und Sie den angemeldeten Benutzer erhalten.
  • Hinweis: die id: hier ist nicht erforderlich, das Modell übergeben wird als die ID verwendet werden.

In users/show.html.erb, ändern:

<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 eine Variable ist, würde die Sie nicht in Ihrem users_controller definiert haben, wie Sie in der quiz_bs_controller tun. Sie greifen auf @user.quiz_bs zu, sodass Sie in Ihrem Code auf diese bestimmte Instanz verweisen möchten.

Die globale @quiz_b nur auf Seiten funktioniert, wo Sie diese Variable definiert haben, die jede Seite unter den quiz_b Routen wäre. Schließlich

, in quiz_bs_controller:

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

Wenn sie in Verbindung mit einem Formular erklärt mit dieser Methode als:

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

Sie benötigen :quiz_bs von Ihrem params um Umfang benötigen, um Ihre Parameter das Modell wird in der Form bearbeitet; in diesem Fall @quiz_bs. Andernfalls werden keine Variablen gefunden, wenn Sie das Quiz aktualisieren/erstellen.

+0

Ich bekomme immer noch einen Fehler beim Verweisen auf den Link auf der 'application.html.erb' Seite (leider glaube ich nicht, dass es sogar auf die Usershow Seite gekommen ist), aber mit diesem geänderten Link steigt der Fehler von der Zeile des Links zur '<% if @ user.quiz_bs == nil%>' Zeile, um diese undefinierte Methode 'quiz_bs' für nil: NilClass' zu sagen. – Liz

+0

Und ich fügte mehr Kontext für die Anwendungsansicht hinzu. – Liz

+0

@Liz Ich habe meine Antwort aktualisiert. Aber eine Sache - kann ein Benutzer mehr als ein Quiz_b haben? – GoGoCarl

0

Hier ist Ihr Problem:

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

Sie haben die Aktion Bearbeiten eine ID übergeben, es ist Teil der Routing-Struktur. In Ihren Routen Ausgabe zeigt es Ihnen auch diese:

/quiz_bs/:id/edit 

Ohne diese ID, die /: id/bearbeitet Weg zur Arbeit zu gehen ist nicht einfach - Mechanismus, dass eine Rails ist.

In Ihrem Gemfile:

group :development do 
    gem 'pry-rails' 
end 

Und:

bundle install 

Dann in Ihrem application.html.erb oberhalb dieser Logik zu tun:

<% 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 %> 

nun wieder die Seite getroffen. Pry wird einen Debug-Haltepunkt verursachen, mit dem Sie das @ user-Objekt im Terminal evaluieren können, auf dem Ihr Server gerade ausgeführt wird. Mein bester Rat ist, dass Sie lernen, Ihren eigenen Code zu debuggen - das ist eine Situation mit vielen Kontexten, die Sie nicht ohne den Zugriff auf Ihre App bereitstellen können.

Verwandte Themen