Rails实例变量在开发中显示,但在Heroku中不显示



我正在开发和生产中创建一个Rails 4.2.3和Postgres数据库的应用程序,部署到Heroku。我的开发环境和生产环境都是用相同的数据播种的。

我有三张表-城市,社区,场地。

class Venues < ActiveRecord::Base
  belongs_to :neighborhood
end
class Neighborhood < ActiveRecord::Base
  belongs_to :city
  has_many :venues
end
class City < ActiveRecord::Base
  has_many :neighborhoods
end

在app上/views/neighborhoods/show.html。我想显示属于那个社区的场馆。

app/controllers/neighborhoods_controller。Rb显示动作如下:

def show
  @city = City.find(params[:city_id])
  @neighborhood = @city.neighborhoods.find(params[:id])
  @venues = Venue.where(neighborhood_id: @neighborhood)
end

社区路线嵌入在城市路线中,但场馆是未嵌入的单独资源。

resources :cities do
  resources :neighborhoods
end
resources :venues

任何特定社区的Neighborhood显示页面显示社区名称,城市名称,然后通过@场馆实例变量检查是否有任何场馆。如果是,它遍历每个场地,否则它声明没有场地。app/views/社区/show.html.erb

<h1><%= @neighborhood.hood_name + ', ' + @city.city_name %></h1>
<% if @venues.present? %>
  <h3>Venues</h3>
  <% @venues.each do |venue|  %>
    <p><%= link_to venue.venue_name, venue %></p>
  <% end %>        
<% else %>
  <p>There are no venues in this neighborhood</p>
<% end %>

这在我的mac上在开发模式下工作得很好,但是当我将它加载到Heroku时,@场馆实例变量总是nil。我使用irb和控制台确认场地确实在Heroku的数据库中。他们只是没有被认出来。知道怎么解决这个问题吗?日志上没有任何线索。从gem的角度来看,除了pg gem,在生产中我使用gem 'rails_12factor', '0.0.3'和'puma','~> 2.12.2'。

我试图将一个简单的实例变量从控制器传递到城市控制器/显示页面和邻居控制器/显示页面的显示页面。app/controllers/cities_controller.rb

<>之前def显示@hellocity ="来自城市控制器中的show动作的Hello。"结束之前

app/controllers/neighborhoods_controller.rb

<>之前def显示@hellohood = "来自邻域控制器中的show动作的Hello。"结束之前

然后在视图中分别调用:app/views/城市/show.html.erb

<%= @hellocity %>

app/views/社区/show.html.erb

<%= @hellohood %>

结果是在我的开发环境中,当我访问任何城市页面时,我得到hellohood消息,当我访问任何邻居页面时,我得到hellohood消息。但是当我把这个放到Heroku上时,我只能在城市页面上看到消息。实例变量没有被传递到app/views/neighborhoods/show.html。erb页面。@neighborhoods和@cities正在被通过,但其他任何内容(例如@hellohood或@场馆)都被封锁了。很奇怪。

首先,您需要确保您的Heroku数据库中有这些数据。

我建议在heroku上运行rails console,一步一步调试你的数据。你从params[:city_id]params[:id]中知道city_idneighborhood_id

只需依次运行这些行并检查每一行的结果:

city = City.find(params[:city_id]) # does city exists?
neighborhood = city.neighborhoods.find(params[:id]) # does it have neighbors?
venues = Venue.where(neighborhood_id: neighborhood) # do you have venues?

我敢肯定你会找到丢失的数据。

实际上你只需要检查你是否有那个社区id的场地。如果你没有遇到"Page not found"错误,那么你的CityNeighborhood已经存在。

结果:我能够通过重置Heroku上的Postgres数据库来解决这个问题。我通过运行迁移删除了邻域表。
rails generate migration DropNeighborhoodsTable

填充迁移文件:

class DropNeighborhoodsTable < ActiveRecord::Migration
  def up
    drop_table :neighborhoods
  end
  def down
    raise ActiveRecord::IrreversibleMigration
  end
end

然后迁移数据库到Heroku:
heroku run rake db:migrate

然后我重新生成邻域模型/表,然后重新播种数据。但是这个过程我做了好几次才成功。最后一次,我将城市表从包含美国所有城市(约30,000)减少到仅包含本地城市(约100)。所以问题可能是我现在在Heroku上使用的是免费层,数据太多了,所以不知怎么的就卡住了。老实说,我不知道。

相关内容

最新更新