Rails代码适用于开发但不适用于生产

时间:2017-06-27 22:52:41

标签: ruby-on-rails ruby

我的一个视图文件中有一些ruby if / else语句,如果yes属性为truefalse null,则应突出显示不同颜色的行{1}}或yes。行在开发中相应地改变颜色但不生产。在生产中,即使数据库中的null不是<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> ,所有内容都显示为红色并且没有响应。我不知道为什么这不仅仅适用于生产?

码/ admin.html.erb

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

codes_controller.rb

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

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

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

css

function reqListener () {
  console.log(this.responseText);
}

var oReq = new XMLHttpRequest();
oReq.addEventListener("load", reqListener);
oReq.open("GET", "http://www.example.org/example.txt");
oReq.send()

3 个答案:

答案 0 :(得分:2)

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

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

即使在通过浏览器进行检查之前,您可以通过rails控制台最有效地完成一些调试步骤,以便在生产时启动。从您的codes_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提到你可能在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 %>

再见条件!

答案 1 :(得分:1)

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

我敢打赌,如果你比较你的prod / dev日志,你会看到布尔值没有在prod中返回为't''f',导致你的条件命中{{1} 1}}每一次。

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

答案 2 :(得分:0)

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

即可

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