Rails代码在开发中工作,但在生产中不起作用



我的一个视图文件中有一些 rubyif/else语句,这些语句应该根据yes属性是truefalse还是null来突出显示行不同的颜色。行在开发中会相应地更改颜色,但不会在生产中相应地更改颜色。在生产环境中,每件事都显示为红色,即使数据库中未nullyes也不会显示响应。我一直在试图弄清楚为什么这只在生产中不起作用?

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查询(在您的管理操作中)未返回您期望的内容。

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

即使在通过浏览器进行检查之前,您也可以通过 rails 控制台最有效地完成几个调试步骤,因此请在生产中启动它。从codes_controller/管理员执行Code.find_by_sql查询,检查并验证结果是否符合预期。接下来,在 rails 控制台中helper.asset_path('name_of_your_stylesheet.css').结果应指示您的问题所在。

如果是配置问题,请检查您的配置/环境/生产.rb是否已正确配置。配置可能因平台而异,请确保您遵循他们的文档。如果您使用的是 heroku,请检查您是否有config.assets.compile = false,并config.public_file_server.enabled = true它是否是 rails 5。

George 提到你可能在 dev 中使用 sqlite,也可能在你的生产数据库中使用 Postgres,这将导致你的 else 分支始终执行。如果是这样的话,它很好地说明了永远不使用SQLite的原因。否则,也许你在dev中本地使用MySQL,在prod中使用Postgres?我相信你可以解决这个问题。

最后,摆脱污染视图代码的条件。tr 类可以有三种可能的颜色,3 个字符串中的 1 个将包含在td通孔中。您不需要一堆条件,您可以创建一个帮助程序方法。或者创建一个哈希并为每个代码查找所需的值(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'vs.'true'vs.'1'.

我敢打赌,如果您比较您的生产/开发日志,您会看到布尔值没有作为 prod 中的't''f'返回,从而导致您的条件每次都命中else

要解决此问题,请确保在生产和开发中运行相同的数据库!

尝试在本地计算机中运行生产中的项目,以查看是否适用于本地数据库。只需使用RAILS_ENV=production rails s

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

最新更新