我正在开发和生产中创建一个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_id
和neighborhood_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"错误,那么你的City
和Neighborhood
已经存在。
结果:我能够通过重置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上使用的是免费层,数据太多了,所以不知怎么的就卡住了。老实说,我不知道。