【问题标题】:Ruby on Rails current_user not recognized in css.erbRuby on Rails current_user 在 css.erb 中无法识别
【发布时间】:2017-08-14 13:02:04
【问题描述】:

所以我将 pages.scss 扩展名更改为 pages.scss.erb 但如果我尝试(顺便说一句,我使用设计):

 <% if current_user.admin == true%>
    body { background-color: white}
 <% else %>
    body { background-color: black}
 <% end %>

它给了我一个错误: 显示第 5 行引发的 /app/views/layouts/application.html.erb : #

的未定义局部变量或方法 current_user

但是如果我尝试使用 User.current 而不是 current_user 它不会给我一个错误但代码不起作用....我尝试使用(我在 a 的值之间循环):

    <% a = true %>
    <% if a == true%>
       body { background-color: white}
     <% else %>
        body { background-color: black}
     <% end %>

成功了

【问题讨论】:

  • 您的current_user 方法在哪里定义?在助手、控制器或其他地方?
  • current_user 不应在模型中定义。不管它是如何定义的,它应该是控制器的关注点。我认为您需要回顾一下您是如何处理身份验证的。
  • @TomLord 好的,那么我如何在应用程序控制器中定义它
  • @TomLord 哦,对不起,我忘了我正在使用设计
  • 提供动态样式表通常是个坏主意,因为 Rails 喜欢预编译它的资产。将admin 类添加到body 标签(取决于当前用户的角色)并为body { ... }body.admin { ... } 设置不同的背景颜色会容易得多

标签: css ruby-on-rails ruby


【解决方案1】:

您想要达到的结果假定在每个请求上预编译 css。动态资产预编译对于开发环境来说是正常的,以加快您的开发过程。然而,在生产或登台环境中,资产通常在部署期间编译一次(rake assets:precompile)。资产只是静态的,并且在生产中通常由例如 nginx 提供服务。

所以如果你真的想要一些动态的 CSS,根据用户的角色,考虑把它放到布局中。从那里您将能够使用辅助方法和控制器变量。

<style type="text/css">  
  <% if current_user.admin == true %>
    body { background-color: white }
  <% else %>
    body { background-color: black }
  <% end %>
</style> 

或者,更好的方法是在您的 .css 文件中为管理员和普通用户定义 CSS 类,然后在您的 .html.erb 模板中根据您的 current_user 使用它们。

我尝试使用(我在 a 的值之间循环):

<% a = true %>
<% if a == true%>
  body { background-color: white }
<% else %>
  body { background-color: black }
<% end %>

成功了

它之所以有效,是因为 Rails 资产管道通常支持嵌入式 ruby​​,但假设它会在编译期间被调用一次。它不应该与请求及其环境有关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多