heroku上的ActionView :: Template :: Error(未定义的方法`program' for nil:NilClass)

时间:2015-05-06 19:08:45

标签: ruby-on-rails ruby-on-rails-4 heroku

我的应用在本地运行没有任何问题。但是,一旦我将其推送到Heroku,我就无法列出帐户页面。

Heroku Logs

2015-05-06T18:10:57.822981+00:00 app[web.1]:   Rendered layouts/_navbar.html.erb (81.2ms)
2015-05-06T18:10:57.823499+00:00 app[web.1]: Completed 200 OK in 84ms (Views: 3.4ms | ActiveRecord: 79.7ms)
2015-05-06T18:10:57.737903+00:00 app[web.1]: Started GET "/" for 173.210.102.18 at 2015-05-06 18:10:57 +0000
2015-05-06T18:10:57.740837+00:00 app[web.1]:   Rendered pages/index.html.erb within layouts/application (0.2ms)
2015-05-06T18:10:57.741590+00:00 app[web.1]:   Rendered layouts/_bootstrap.html.erb (0.0ms)
2015-05-06T18:10:57.823257+00:00 app[web.1]:   Rendered layouts/_footer.html.erb (0.1ms)
2015-05-06T18:10:57.739651+00:00 app[web.1]: Processing by PagesController#index as HTML
2015-05-06T18:10:57.741030+00:00 app[web.1]:   Rendered layouts/_bootstrap.html.erb (0.0ms)
2015-05-06T18:10:57.827130+00:00 heroku[router]: at=info method=GET path="/" host=intakelog.herokuapp.com request_id=cc5c6773-706f-4de2-9ddc-a435206f666c fwd="173.210.102.18" dyno=web.1 connect=1ms service=91ms status=304 bytes=844
2015-05-06T18:10:58.143345+00:00 heroku[router]: at=info method=GET path="/assets/application-3d36a00ee9ab0b0ddd1f3a157f3d5e63.css" host=intakelog.herokuapp.com request_id=cb43b329-b4bf-4864-9340-7598b60df22f fwd="173.210.102.18" dyno=web.1 connect=1ms service=4ms status=304 bytes=133
2015-05-06T18:10:58.525722+00:00 heroku[router]: at=info method=GET path="/favicon.ico" host=intakelog.herokuapp.com request_id=3e0c1c4a-463d-499f-b0a6-f608ebc2880e fwd="173.210.102.18" dyno=web.1 connect=1ms service=4ms status=304 bytes=133
2015-05-06T18:11:05.501469+00:00 app[web.1]: Completed 500 Internal Server Error in 47ms
2015-05-06T18:11:05.502887+00:00 app[web.1]: 
2015-05-06T18:11:05.502891+00:00 app[web.1]:     19:         <td><%= account.last_name %></td>
2015-05-06T18:11:05.502898+00:00 app[web.1]:     24:         <td><%= link_to 'Edit', edit_account_path(account), class: "btn btn-link" %></td>
2015-05-06T18:11:05.502900+00:00 app[web.1]:     25:         <td><%= link_to 'Destroy', account, method: :delete, data: { confirm: 'Are you sure?' }, class: "btn btn-link" %></td>
2015-05-06T18:11:05.502893+00:00 app[web.1]:     21:         <td><%= account.phone %></td>
2015-05-06T18:11:05.502889+00:00 app[web.1]: ActionView::Template::Error (undefined method `program' for nil:NilClass):
2015-05-06T18:11:05.452737+00:00 app[web.1]: Started GET "/accounts" for 173.210.102.18 at 2015-05-06 18:11:05 +0000
2015-05-06T18:11:05.501366+00:00 app[web.1]:   Rendered accounts/index.html.erb within layouts/application (45.7ms)
2015-05-06T18:11:05.502892+00:00 app[web.1]:     20:         <td><%= account.address %></td>
2015-05-06T18:11:05.502902+00:00 app[web.1]:   app/views/accounts/index.html.erb:22:in `block in _app_views_accounts_index_html_erb___1462060006632552356_70044541209800'
2015-05-06T18:11:05.502896+00:00 app[web.1]:     23:         <td><%= link_to 'Show', account, class: "btn btn-link" %></td>
2015-05-06T18:11:05.502903+00:00 app[web.1]:   app/views/accounts/index.html.erb:16:in `_app_views_accounts_index_html_erb___1462060006632552356_70044541209800'
2015-05-06T18:11:05.502905+00:00 app[web.1]:   app/controllers/accounts_controller.rb:8:in `index'
2015-05-06T18:11:05.502906+00:00 app[web.1]: 
2015-05-06T18:11:05.502907+00:00 app[web.1]: 
2015-05-06T18:11:05.562895+00:00 app[web.1]: Started GET "/accounts" for 173.210.102.18 at 2015-05-06 18:11:05 +0000
2015-05-06T18:11:05.566966+00:00 app[web.1]:   Rendered accounts/index.html.erb within layouts/application (1.8ms)
2015-05-06T18:11:05.567052+00:00 app[web.1]: Completed 500 Internal Server Error in 3ms
2015-05-06T18:11:05.568568+00:00 app[web.1]: 
2015-05-06T18:11:05.568570+00:00 app[web.1]: ActionView::Template::Error (undefined method `program' for nil:NilClass):
2015-05-06T18:11:05.568572+00:00 app[web.1]:     19:         <td><%= account.last_name %></td>
2015-05-06T18:11:05.568576+00:00 app[web.1]:     22:         <td><%= account.program.program %></td>
2015-05-06T18:11:05.568577+00:00 app[web.1]:     23:         <td><%= link_to 'Show', account, class: "btn btn-link" %></td>
2015-05-06T18:11:05.568579+00:00 app[web.1]:     24:         <td><%= link_to 'Edit', edit_account_path(account), class: "btn btn-link" %></td>
2015-05-06T18:11:05.568581+00:00 app[web.1]:     25:         <td><%= link_to 'Destroy', account, method: :delete, data: { confirm: 'Are you sure?' }, class: "btn btn-link" %></td>
2015-05-06T18:11:05.568582+00:00 app[web.1]:   app/views/accounts/index.html.erb:22:in `block in _app_views_accounts_index_html_erb___1462060006632552356_70044541209800'
2015-05-06T18:11:05.568584+00:00 app[web.1]:   app/views/accounts/index.html.erb:16:in `_app_views_accounts_index_html_erb___1462060006632552356_70044541209800'
2015-05-06T18:11:05.568585+00:00 app[web.1]:   app/controllers/accounts_controller.rb:8:in `index'
2015-05-06T18:11:05.568587+00:00 app[web.1]: 
2015-05-06T18:11:05.568573+00:00 app[web.1]:     20:         <td><%= account.address %></td>
2015-05-06T18:11:05.568575+00:00 app[web.1]:     21:         <td><%= account.phone %></td>
2015-05-06T18:11:05.502895+00:00 app[web.1]:     22:         <td><%= account.program.program %></td>
2015-05-06T18:11:05.454378+00:00 app[web.1]: Processing by AccountsController#index as HTML
2015-05-06T18:11:05.564159+00:00 app[web.1]: Processing by AccountsController#index as HTML
2015-05-06T18:11:05.568588+00:00 app[web.1]: 
2015-05-06T18:11:05.509049+00:00 heroku[router]: at=info method=GET path="/accounts" host=intakelog.herokuapp.com request_id=fb22278a-99e2-4e1f-946c-272015814ae7 fwd="173.210.102.18" dyno=web.1 connect=1ms service=56ms status=500 bytes=1754
2015-05-06T18:11:05.571223+00:00 heroku[router]: at=info method=GET path="/accounts" host=intakelog.herokuapp.com request_id=9cde7b41-7ca0-450a-8072-d3ac3ad41050 fwd="173.210.102.18" dyno=web.1 connect=1ms service=10ms status=500 bytes=1754

我想也许我的数据库不匹配所以我通过运行检查了heroku上的版本

heroku run rake db:version
Running `rake db:version` attached to terminal... up, run.9594
Current version: 20150506165923

它匹配我的架构文件。 ActiveRecord::Schema.define(version: 20150506165923)

我怀疑这是我的accounts_controller.rb文件。但是,由于它在我的本地环境中工作,我不确定它是什么。

accounts_controller.rb

class AccountsController < ApplicationController
  before_action :set_account, only: [:show, :edit, :update, :destroy]

  respond_to :html

  def index
    @account = Account.all
    respond_with(@account)
  end

  def show
    @notes = Note.where(account_id: @account.id) #Where a note belong to the current account
  end

  def new
    @account = Account.new
    respond_with(@account)
  end

  def edit
  end

  def create
    @account = Account.new(account_params)
    @account.save
    respond_with(@account)
  end

  def update
    @account.update(account_params)
    respond_with(@account)
  end

  def destroy
    @account.destroy
    respond_with(@account)
  end

  private
    def set_account
      @account = Account.find(params[:id])
    end

    def account_params
      params.require(:account).permit(:first_name, :last_name, :program_id, :address, :phone)
    end
end

index.html.erb for Accounts

<h1>Listing accounts</h1>

<table class="table table-hover table-condensed">
  <thead>
    <tr>
      <th>First name</th>
      <th>Last name</th>
      <th>Address</th>
      <th>Phone</th>
      <th>Program</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @account.each do |account| %>
      <tr>
        <td><%= account.first_name %></td>
        <td><%= account.last_name %></td>
        <td><%= account.address %></td>
        <td><%= account.phone %></td>
        <td><%= account.program.program %></td>
        <td><%= link_to 'Show', account, class: "btn btn-link" %></td>
        <td><%= link_to 'Edit', edit_account_path(account), class: "btn btn-link" %></td>
        <td><%= link_to 'Destroy', account, method: :delete, data: { confirm: 'Are you sure?' }, class: "btn btn-link" %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New Account', new_account_path %>

Rake Routes

rake routes
                  Prefix Verb   URI Pattern                                    Controller#Action
        new_user_session GET    /users/sign_in(.:format)                       devise/sessions#new
            user_session POST   /users/sign_in(.:format)                       devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)                      devise/sessions#destroy
           user_password POST   /users/password(.:format)                      devise/passwords#create
       new_user_password GET    /users/password/new(.:format)                  devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format)                 devise/passwords#edit
                         PATCH  /users/password(.:format)                      devise/passwords#update
                         PUT    /users/password(.:format)                      devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)                        devise/registrations#cancel
       user_registration POST   /users(.:format)                               devise/registrations#create
   new_user_registration GET    /users/sign_up(.:format)                       devise/registrations#new
  edit_user_registration GET    /users/edit(.:format)                          devise/registrations#edit
                         PATCH  /users(.:format)                               devise/registrations#update
                         PUT    /users(.:format)                               devise/registrations#update
                         DELETE /users(.:format)                               devise/registrations#destroy
           account_notes POST   /accounts/:account_id/notes(.:format)          notes#create
        new_account_note GET    /accounts/:account_id/notes/new(.:format)      notes#new
       edit_account_note GET    /accounts/:account_id/notes/:id/edit(.:format) notes#edit
            account_note PATCH  /accounts/:account_id/notes/:id(.:format)      notes#update
                         PUT    /accounts/:account_id/notes/:id(.:format)      notes#update
                         DELETE /accounts/:account_id/notes/:id(.:format)      notes#destroy
                accounts GET    /accounts(.:format)                            accounts#index
                         POST   /accounts(.:format)                            accounts#create
             new_account GET    /accounts/new(.:format)                        accounts#new
            edit_account GET    /accounts/:id/edit(.:format)                   accounts#edit
                 account GET    /accounts/:id(.:format)                        accounts#show
                         PATCH  /accounts/:id(.:format)                        accounts#update
                         PUT    /accounts/:id(.:format)                        accounts#update
                         DELETE /accounts/:id(.:format)                        accounts#destroy
                programs GET    /programs(.:format)                            programs#index
                         POST   /programs(.:format)                            programs#create
             new_program GET    /programs/new(.:format)                        programs#new
            edit_program GET    /programs/:id/edit(.:format)                   programs#edit
                 program GET    /programs/:id(.:format)                        programs#show
                         PATCH  /programs/:id(.:format)                        programs#update
                         PUT    /programs/:id(.:format)                        programs#update
                         DELETE /programs/:id(.:format)                        programs#destroy
             pages_index GET    /pages/index(.:format)                         pages#index
                    root GET    /                                              pages#index

2 个答案:

答案 0 :(得分:1)

试试这个:

而不是:

<td><%= account.program.program %></td>

尝试:

<td><%= account.program ? account.program.program : "" %></td>

在尝试访问其任何属性之前,您需要验证account.program是否存在,以下是不太简洁的代码:

<td>

<%if account.program%>
   <%=account.program.program%>
<%else%>
   Program doesn't exist
<%end%>

</td>

答案 1 :(得分:0)

您的帐户控制器中似乎没有定义任何名为program的方法。

<td><%= account.program.program %></td>

这似乎抛出了这个错误。尝试注释掉此代码并重新部署。