2017-03-10 74 views
0

我想知道有沒有人可以幫助這個......對我來說非常令人沮喪。Rails5路由和條件語句

首先,我對這一切仍然很陌生。非常抱歉,如果我得到一些術語錯誤。我已經完成了一些教程,現在正在研究我的第一個應用程序,沒有任何指導演練......它的進展緩慢:)

我有兩組頁面,一組我應該顯示一個側欄和一個組需要它。下面是我的路線......

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 

我有我的頭下面的代碼的正常工作......

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

它提供了一個側邊欄上面並沒有列出別人的路徑。但是...我希望從「project_path」所以/項目/ 6等添加到列表頁面上方爲了實現這一目標,我添加以下行上面的代碼...

current_page?(project_path(:id) 

導致英寸..

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

一旦添加應用程序加載罰款,但側邊欄不會添加到項目頁面。所以,我想另一種方法如下...

current_page?(project_path(@project)) 

這項修訂後的項目頁面現在可正確顯示側邊欄,但是......沒有側邊欄的所有其他網頁失敗,出現以下錯誤加載。 ..

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

我在我無計可施......我也曾嘗試

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

是否有人可以把我從我的痛苦......那不是誇張...純苦難。

非常感謝。

+0

...如果我告訴你它現在03:51在上午,我在早上工作....看到我完全承諾...任何接受者 –

回答

0

而且這看起來醜陋:

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

根據您的應用程序,你可以使用像一個before_action:

的ApplicationController:

def show_sidebar 
    @show_it = true 
end 

ProjectsController:

before_action :show_sidebar, only: [:show] 

,並考慮:

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

(這應該工作(不完全確定有關語法 - 牛逼也:))。也可以嘗試:

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

你也可以使用相同的邏輯和替換「真」「假」,並在before_action方法告訴控制器,其中不顯示側邊欄。

希望這會有所幫助。

p.s.下一次還會顯示/看看你自己的日誌,如果你從Rails得到錯誤的行爲而沒有錯誤

+0

嗨JD在我的絕望中,我發佈了我的問題在幾個不同的論壇上,我似乎已經將它添加到SO兩次...它在這裏得到了答覆... [所以] (http://stackoverflow.com/questions/42718419/why-does-rails-not-recognise-project-path)順便說一下,我整理了代碼......但做了不同的處理。我在標題本身添加了一個IF子句,只是添加了渲染表單助手 –

+0

@Sergio答案很有趣,他寫了答案只回答你的問題,現在這個解決方案看起來好多了,但我仍然認爲這個長OR OR OR語句是錯誤的。它絕對違反了MVC中的某些內容,特別是如果你在視圖中執行它。所以我仍然認爲自己的方式更好,但是我覺得ApplicationHelper可以做得更加優雅。 –

+0

是的,我同意OR語句不是很好。目前,我只是想以一種我能理解的方式讓所有的東西都能夠工作。將有第二個,毫無疑問,我重構所有代碼的第三個版本,我也非常確定,那時我將使用ember.js重寫大多數js的視圖。因此,目前我只是將事物慢慢地,謝謝你的幫助。我們歡迎您來到我們的 –