【问题标题】:Rails5 Routing and conditional statementsRails5 路由和条件语句
【发布时间】:2017-03-10 03:37:22
【问题描述】:

我想知道是否有人可以提供帮助...这对我来说非常令人沮丧。

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

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

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”添加到上面的页面列表中,所以 /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])))

有人可以让我摆脱痛苦吗...这不是夸张...纯粹的痛苦。

非常感谢。

【问题讨论】:

  • ...如果我告诉你现在是凌晨 03:51 并且我早上有工作...看我完全投入...任何接受者

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


【解决方案1】:

这看起来也很丑:

<% 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 之类的东西:

应用控制器:

def show_sidebar
  @show_it = true
end

项目控制器:

before_action :show_sidebar, only: [:show]  

并且在视图中:

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

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

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

您也可以使用相同的逻辑并将“true”替换为“false”,并在 before_action 方法中告诉控制器不显示侧边栏的位置。

希望这会有所帮助。

附言下次还显示/查看自己的日志,如果您在 Rails 没有错误的情况下出现错误行为

【讨论】:

  • 嗨 J.D 在我绝望中,我在几个不同的论坛上发布了我的问题,我似乎已经将它添加到 SO 两次......它在这里得到了回答......SO顺便说一句,我整理了上代码...但做的不同。我在标题本身中添加了一个 IF 子句,并添加了渲染表单助手
  • @Sergio 的答案很有趣,他写答案只是为了回答你的问题,这个解决方案现在看起来更好,但我仍然认为这个长 OR OR OR 语句是错误的。它肯定违反了 MVC 中的某些内容,特别是如果你在视图中这样做。所以我仍然认为我的方式更好,但是我觉得通过 ApplicationHelper 可以做得更优雅。
  • 是的,我同意 OR 语句不是很好。目前我只想让一切以我理解的方式工作。将会有第二个,毫无疑问是第三个版本,我重构所有代码,我也很确定到那时我将使用 ember.js 为 js 重写大部分视图所以目前我只是在做一些事情有点慢,谢谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
相关资源
最近更新 更多