2017-03-10 4 views
0

Ich frage mich, ob jemand damit helfen kann ... es ist sehr frustrierend für mich.Rails5 Routing und bedingte Anweisungen

Erstens bin ich immer noch ziemlich neu in all dem. Ich entschuldige mich, wenn ich eine falsche Terminologie bekomme. Ich habe einige Tutorials abgeschlossen und arbeite jetzt an meiner ersten App ohne geführte Walkthroughs ... es geht langsam :)

Ich habe zwei Gruppen von Seiten, eine Gruppe, wo ich eine Sidebar zeigen sollte und eine Gruppe, die nicht tut brauchen. meine Routen ...

Rails.application.routes.draw do 

#----Pages---- 
root 'pages#home' 
get '/home', to: 'pages#home' 
get '/contact', to: 'pages#contact' 

#----Users---- 
get '/app', to: 'users#app' 
get 'users/new', to: 'users#new' 
get '/users', to: 'users#index' 
get '/signup', to: 'users#new' 
post '/signup', to: 'users#create' 

#----Sessions---- 
get '/login', to: 'sessions#new' 
post '/login', to: 'sessions#create' 
delete '/logout', to: 'sessions#destroy' 


#----Projects---- 
get'/projects/:id', to: 'projects#show' 
get '/projects', to: 'projects#index' 
get '/projects/new', to: 'projects#new' 
post '/projects/new', to: 'projects#create' 


#----Hazards---- 
get'/hazards/:id', to: 'hazards#show' 
get '/hazards', to: 'hazards#index' 
get '/hazards/new', to: 'hazards#new' 

#----Resources---- 
resources :users 
resources :projects 
resources :hazards 
end 

Ich habe den folgenden Code in meinem Kopf Im Folgenden sind die gut funktioniert ...

<% if current_page?(app_path) || 
      current_page?(users_path) || 
      current_page?(projects_path) || 
      current_page?(hazards_path) 
    <%= render 'layouts/sidebar' %> 
<% end %> 

es eine Sidebar auf diesen Pfaden oben und nicht auf die anderen liefert aufgeführt. Allerdings ... Ich wünsche oben Seiten aus dem ‚project_path‘ so/projects/6 usw. auf der Liste hinzuzufügen Um dies zu erreichen, ich die folgende Zeile in dem obigen Code ... hinzugefügt in

current_page?(project_path(:id) 

führt. ..

<% if current_page?(app_path) || 
      current_page?(users_path) || 
      current_page?(projects_path) || 
      current_page?(hazards_path) || 
      current_page?(project_path(:id)) %> 
    <%= render 'layouts/sidebar' %> 

<% end %> 

Nach dem Hinzufügen der App lädt fein, aber die Sidebar wird nicht auf der Projektseite hinzugefügt. Also habe ich versucht, ein alternatives Verfahren wie folgt ...

current_page?(project_path(@project)) 

Nach dieser Änderung der Projektseite nun die Seitenleiste zeigt richtig, aber ... alle anderen Seiten, die nicht scheitern die Sidebar haben mit dem folgenden Fehler zu laden. ..

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

ich an meinem Latein am Ende bin ... ich habe auch versucht

current_page?(project_path(params.permit)) 
Current_page?(project_path(project)) 
current_page?(project_path(project(params[:id]))) 

mir bitte jemand kann aus meinem Elend setzen ... das ist keine Übertreibung ... pure Elend.

vielen dank.

+0

bekommen ... was ist, wenn ich Ihnen sagte, dass es jetzt 03:51 in der bin und ich habe am Morgen arbeiten .... Ich bin total engagiert ... jeder Nehmer –

Antwort

0

Auch das sieht hässlich:

<% if current_page?(app_path) || 
    current_page?(users_path) || 
    current_page?(projects_path) || 
    current_page?(hazards_path) || 
    current_page?(project_path(:id)) %> 
<%= render 'layouts/sidebar' %> 

auf Ihrer App Je Sie so etwas wie ein before_action verwenden:

Application:

def show_sidebar 
    @show_it = true 
end 

ProjectsController:

before_action :show_sidebar, only: [:show] 

Und im Blick:

<%= render 'layouts/sidebar' if @show_sidebar %> 

(Dies sollte funktionieren (nicht ganz sicher über Syntax - newby auch :)). Können auch versuchen:

<% if @show_sidebar %> 
    <%= render 'layouts/sidebar' %> 
<% end %> 

Sie könnten auch die gleiche Logik verwenden und ‚true‘ auf ‚false‘ und in before_action Methode sagen Controller ersetzen, wo NICHT Sidebar anzuzeigen.

Hoffe, das hilft.

p.s. Das nächste Mal auch zeigen/sehen Sie sich Protokolle, wenn Sie falsches Verhalten ohne Fehler von Rails

+0

Hallo JD in meiner Verzweiflung, ich habe meine Frage in ein paar verschiedenen Foren veröffentlicht und ich habe es SO zweimal hinzugefügt ... es wurde hier beantwortet ... [SO] (http://stackoverflow.com/questions/42718419/why-does-rails-not-recognise-project-path) Übrigens habe ich den Code aufgeräumt ... aber ich tat es anders. Ich habe eine IF-Klausel in den Header selbst und fügte nur die Render-Formular Helper –

+0

@ Sergio Antwort ist interessant und er schrieb Antwort auf nur Ihre Frage zu beantworten und diese Lösung sieht jetzt besser aus, aber immer noch denke ich, dass diese lange OR OR OR-Anweisung falsch ist . Es verletzt definitiv etwas in MVC, besonders wenn du es in einer Ansicht tust. Also denke ich immer noch meinen Weg besser, aber ich fühle, dass es vielleicht noch eleganter vom ApplicationHelper gemacht wird. –

+0

Ja, ich stimme zu, dass die OR-Anweisungen nicht großartig sind. Im Moment will ich einfach alles so funktionieren lassen, wie ich es verstehe. Es wird eine zweite und zweifellos dritte Version geben, in der ich den gesamten Code umgestalte. Ich bin mir auch ziemlich sicher, dass ich die meisten Ansichten für js mit ember.js umschreiben werde. Im Moment nehme ich einfach die Dinge ein wenig langsam, danke fürs Aushelfen. –

Verwandte Themen