[英]Rails code works in development but not in production
我的一个视图文件中有一些ruby if
/ else
语句,根据yes
属性为true
, false
或null
,应突出显示行的不同颜色。 这些行在开发中会相应更改颜色,但在生产中不会更改。 在生产中,即使数据库中的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.