繁体   English   中英

Rails代码在开发中有效,但在生产中无效

[英]Rails code works in development but not in production

我的一个视图文件中有一些ruby if / else语句,根据yes属性为truefalsenull ,应突出显示行的不同颜色。 这些行在开发中会相应更改颜色,但在生产中不会更改。 在生产中,即使数据库中的yes不为null ,所有事物也会以红色显示并表示没有响应。 我一直在努力弄清楚为什么这仅在生产中不起作用?

codes / admin.html.erb

<tbody>
  <% @code.each do |c| %>
    <% if c.yes == 't' %>
      <tr class = "green">
    <% elsif c.yes == 'f' %>
      <tr class = "gray">
    <% else %>
      <tr class = "red">
    <% end %>
      <td><%= c.code %></td>
      <td><%= c.name %></td>      
      <td><%= c.email %></td>
    <% if c.yes == 't' %>
      <td >Yes</td>
    <% elsif c.yes == 'f' %>
      <td >No</td>
    <% else %>
      <td > No Response</td>
    <% end %>
      <td><%= c.meal %></td>
    </tr>
  <% end %>
</tbody>

codes_controller.rb

def admin      
  @children = Child.all
  @code = Code.find_by_sql("SELECT c.code, g.name, g.email, g.yes, g.id as guest_id, m.name as meal
                            FROM codes c
                            LEFT OUTER JOIN guests g on g.code_id = c.id
                            LEFT OUTER JOIN meals m on g.meal_id = m.id
                           ")
end

的CSS

.red{
  background-color: #5e0009;
  color: white;
}

.gray{
  background-color: gray;
  color: white;
}

.green{
  background-color: #648293;
  color: white;
}

由于您的生产环境配置,样式表可能未加载,或者@code查询(在admin操作中)未返回您期望的结果。

检查不是您期望的颜色的元素。 在开发人员工具中,使用“源”选项卡来验证样式表是否存在。 如果您的样式表不在源文件中,则说明问题与资产有关。 这意味着您的产品环境配置错误,资产文件本身不在正确的目录中,或者您缺少require语句。

甚至在通过浏览器进行检查之前,您可以通过Rails控制台最有效地完成几个调试步骤,以便在产品上进行调试。 从您的code_controller / admin执行Code.find_by_sql查询,检查并确认结果是否符合预期。 接下来,在rails控制台中helper.asset_path('name_of_your_stylesheet.css') 结果应指出您的问题所在。

如果是配置文件,请检查config / environments / production.rb的配置是否正确。 配置因平台而异,请确保遵循其文档。 如果您使用的是heroku,请检查是否具有config.assets.compile = false以及config.public_file_server.enabled = true如果它是轨道5)。

George提到您可能在开发数据库中使用了sqlite,并可能在生产数据库中使用了Postgres,这将导致您的else分支始终执行。 如果是这样,那就很好地说明了从不使用SQLite的原因。 否则,也许您在开发人员本地使用MySQL,而在生产中使用Postgres? 我敢肯定,你可以解决这个问题。

最后,摆脱污染视图代码的条件。 tr类可以是三种可能的颜色,并且3个字符串中的1个将封装在td via中。 您不需要那么多条件,可以创建一个辅助方法。 或创建一个哈希并为每个代码查找所需的值( td字符串和tr类)。

要进行哈希处理,您将具有如下所示的哈希值:

hash = {t: {color: 'green', td_string: 'yes'}, f: {color: "gray", td_string: "No"}}

像这样循环:

 <% @code.each do |c| %>
    <tr class='<%= hash.dig(c.yes.to_sym, :color) || \'red\' %>'>
      <td><%= c.code %></td>
      <td><%= c.name %></td>      
      <td><%= c.email %></td>
      <td><%= hash.dig(c.yes.to_sym, :td_string) || 'No Response'</td>
      <td><%= c.meal %></td>
    </tr>
  <% end %>

再见有条件!

您可能在开发和生产中运行不同的数据库类型(即prod中的MySQL和dev中的SQLite)。 不同的数据库以不同的方式处理布尔值,例如't''true''1'

我敢打赌,如果您比较prod / dev日志,则会发现在prod中布尔值未以't''f'形式返回,从而导致条件每次都击中else

要解决此问题,请确保在prod和dev中都运行相同的数据库!

尝试在本地计算机上的生产环境中运行项目,以查看是否可与本地数据库一起使用。 只需使用RAILS_ENV=production rails s

还要检查css是否正确导入(只需使用inspect元素添加红色,灰色或绿色)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM