Rails5路由和条件语句

时间:2017-03-10 03:37:23

标签: routes conditional ruby-on-rails-5

我想知道是否有人可以帮助解决这个问题......对我来说非常令人沮丧。

首先,我对这一切还很陌生。如果我得到一些错误的术语,请道歉。我已经完成了一些教程,现在正在开发我的第一个应用程序而没有任何导游演练......它的进展缓慢:)

我有两组页面,一组用于显示侧栏,另一组用于不需要侧栏。以下是我的路线......

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

它为上面列出的路径提供了侧边栏,而不是其他路径。但是......我想在“项目路径”的上面的列表中添加一个&#39; so / projects / 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])))

有人可以把我从痛苦中解救出来......这并不夸张......纯粹的痛苦。

非常感谢。

1 个答案:

答案 0 :(得分: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 %>

(这应该工作(不完全确定语法 - newby也:))。也可以试试:

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

您也可以使用相同的逻辑并替换&#39; true&#39;到&#39;假&#39;并在before_action方法告诉控制器哪里不显示侧栏。

希望这有帮助。

P.S。下次还会显示/看到自己的日志,如果你的行为错误而没有来自Rails的错误