2

Heroku にプッシュされた以前のコードでは問題はありませんでしたが、この最後のプッシュでは問題が発生しました。変更された唯一のことは、 each をループする代わりに、 each をループするようstudentになったことuserです。

バックグラウンド

コードはローカルでは機能しますが、Heroku では機能しません。Herokuでエラーが発生しているページは全生徒の一覧(インデックス)です。コードが行っていることは、.Usersを持つすべてをループすることprofile_type = "Student"です。

何らかの理由で、代わりに User オブジェクトを使用する必要がある場合に、Student オブジェクトのポリモーフィック アソシエーション (プロファイル) にアクセスしようとしています。

Heroku からのログ

ActionView::Template::Error (undefined method `profile' for #<Student:0x007f80c5552330>):
35:         <tbody>
36:          <% @students.each do |user| %>
37:           <tr>
38:             <td><%= link_to user.profile.ivywise_id, student_path(user.profile_id) %></td>
39:             <td><%= link_to user.first_name.camelize, student_path(user.profile_id) %></td>
40:             <td><%= link_to user.last_name.camelize, student_path(user.profile_id) %></td>
41:             <td><%= user.email %></td>
app/views/students/index.html.erb:38:in `block in_app_views_students_index_html_erb__3704269538007702833_70095521176320'
app/views/students/index.html.erb:36:in `_app_views_students_index_html_erb__3704269538007702833_70095521176320'

アプリケーションコード

学生.rb

class Student < ActiveRecord::Base
  has_one :user, :as => :profile, dependent: :destroy
...

学生_コントローラー

def index
  @students = User.where(profile_type: "Student").order("last_name")
end

学生向け index.html.erb

  <% @students.each do |user| %>
  <tr>
    <td><%= link_to user.profile.ivywise_id, student_path(user.profile_id) %></td>
    <td><%= link_to user.first_name.camelize, student_path(user.profile_id) %></td>
    <td><%= link_to user.last_name.camelize, student_path(user.profile_id) %></td>
    <td><%= user.email %></td>
    <td></td>
    <td>
      <%= link_to "Edit", edit_student_path(user.profile_id), class: "btn btn-default btn-small" if can? :edit, Student %>
    </td>
  </tr>
  <% end %>

user.rb

class User < ActiveRecord::Base
  belongs_to :profile, :polymorphic => true

私が試したこと:

  • local/dev からのすべての移行が Heroku と同期していることを再確認しました
  • Heroku ファイルのクローンを作成して、同じコードベースが実行されていることを再確認しました
  • コマンドを実行しましheroku restart
  • ダブルチェックして実行heroku run rake db:migrateし、すべてを確認しました
  • データベースをダブルチェックして、すべてのデータと列が同じであることを確認します
  • 他のマシンとブラウザーをチェックしました。まだ同じ問題

確かにイライラします...助けてくれてありがとう!

4

2 に答える 2

3

Leo Correa の提案のおかげで、Rails サーバーをプロダクション モードで起動し、エラーを再現することができました。(私はRAILS_ENV=production rails s、サーバーを本番モードでローカルに起動するために使用しました。)

問題を に絞り込みましたconfig.eager_load。元々は に設定されてtrueいましたが、変更するとconfig.eager_load = false問題が修正されました。

そもそもなぜ問題が解決しないのかはまだわかりませんが、現在は修正されています!

于 2013-09-16T13:05:11.850 に答える
1

同じ問題とそれconfig.eager_loadtrue修正するための設定がありました。ただし、これは本番環境では推奨される設定ではないため、実際に何が問題なのかを突き止めようとしました。

エラーが発生したモデルとはまったく関係がありませんでしたが、他のモデルクラスが正しく設定されていなかったことが原因であることに最終的に気付きました(まだ開発中です)。このconfig.eager_loadオプションが に設定されてtrueいる場合、Rails は最適化のために起動時にすべてのクラスをロードします。一部のモデル クラスが正しくない場合、これが原因で物事が台無しになり、関係がおかしくなる可能性があります。

間違った/不完全なモデル クラスを削除するとすぐに、すべてが再び機能し始めました。

于 2014-03-09T12:47:12.467 に答える