2017-03-10 36 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的视图。因此,目前我只是将事物慢慢地,谢谢你的帮助。我们欢迎您来到我们的 –