2013-12-19 71 views
3

我有一個Rails 4應用程序在Heroku上本地運行SQLite和PostgreSQL。爲什麼我得到ActionView :: Template :: Error:未定義的方法名稱爲nil:NilClass在Heroku上,但不是在本地

我遇到了我的PostController的索引操作問題。我得到了上面的錯誤,但只在Heroku上。

我已經雙重檢查了所有代碼並運行所有遷移並重新啓動了Heroku服務器。我還仔細檢查過遷移在本地和Heroku上都是一樣的。這個問題似乎與通過Post模型訪問用戶模型中的數據有關。例如,我試圖通過Heroku上的Rails控制檯訪問其他屬性,例如電子郵件,但我得到了相同的未定義方法錯誤。所以我很確定它與表連接有關。

另外要澄清一下,我確實有生產數據DB

這裏是我的PostsController行動:

class PostsController < ApplicationController 
    before_filter :authenticate_user!, except: [:index, :show] 

    before_action :set_post, only: [:show, :edit, :update, :destroy] 

    # GET /posts 
    # GET /posts.json 
    def index 
    @posts = Post.all 
    end 
end 

我的帖子型號:

class Post < ActiveRecord::Base 

    belongs_to :user 
end 

我在用戶模式代碼:

class User < ActiveRecord::Base 

    rolify 

    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable, :confirmable 

    belongs_to :qualification 
    has_many :posts 

    validates :phone, presence: true, format: { with: /\d{3}.\d{3}.\d{4}/, message: "Must be in 555.555.5555 format" } 
    validates :name, presence: true 
    validates :email, presence: true 
    validates :acknowledgement, presence: true 

    # new function to set the password without knowing the current password used in our confirmation controller. 
    def attempt_set_password(params) 
    p = {} 
    p[:password] = params[:password] 
    p[:password_confirmation] = params[:password_confirmation] 
    update_attributes(p) 
    end 

    # new function to return whether a password has been set 
    def has_no_password? 
    self.encrypted_password.blank? 
    end 

    # new function to provide access to protected method unless_confirmed 
    def only_if_unconfirmed 
    pending_any_confirmation {yield} 
    end 

    def password_required? 
    # Password is required if it is being set, but not for new records 
    if !persisted? 
    false 
    else 
    !password.nil? || !password_confirmation.nil? 
    end 
end 

end 

我的index.html.erb文件:

<% @posts.each do |post| %> 
<h2 class='subheader'><%= link_to post.title, post %></h2> 
<h6>written by <%= post.user.name %> on <%= post.created_at.to_s(:long) %></h6> 
<div><%= post.body.html_safe %></div> 
<% if user_signed_in? %> 
<% if current_user.has_role? :admin %> 
<div><%= link_to 'Edit', edit_post_path(post) %></div> 
<div><%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %> </div> 
<% end %> 
<% end %> 
<% end %> 
<br> 

<%= link_to 'New Post', new_post_path %> 

從我的Heroku的輸出日誌:

2013-12-19T06:31:13.280899+00:00 app[web.1]: Started GET "/posts" for 64.114.175.126 at  2013-12-19 06:31:13 +0000 
2013-12-19T06:31:13.280899+00:00 app[web.1]: Started GET "/posts" for 64.114.175.126 at 2013-12-19 06:31:13 +0000 
2013-12-19T06:31:13.283663+00:00 app[web.1]: Processing by PostsController#index as HTML 
2013-12-19T06:31:13.283663+00:00 app[web.1]: Processing by PostsController#index as HTML 
2013-12-19T06:31:13.292344+00:00 app[web.1]: Rendered posts/index.html.erb within layouts/application (6.9ms) 
2013-12-19T06:31:13.292553+00:00 app[web.1]: Completed 500 Internal Server Error in 9ms 
2013-12-19T06:31:13.292344+00:00 app[web.1]: Rendered posts/index.html.erb within layouts/application (6.9ms) 
2013-12-19T06:31:13.292553+00:00 app[web.1]: Completed 500 Internal Server Error in 9ms 
2013-12-19T06:31:13.295581+00:00 app[web.1]: 
2013-12-19T06:31:13.295581+00:00 app[web.1]:  6: <div><%= post.body.html_safe %></div> 
2013-12-19T06:31:13.295581+00:00 app[web.1]:  3: <% @posts.each do |post| %> 
2013-12-19T06:31:13.295581+00:00 app[web.1]:  7: <% if user_signed_in? %> 
2013-12-19T06:31:13.295581+00:00 app[web.1]:  2: 
2013-12-19T06:31:13.295581+00:00 app[web.1]:  4: <h2 class='subheader'><%= link_to post.title, post %></h2> 
2013-12-19T06:31:13.295581+00:00 app[web.1]: ActionView::Template::Error (undefined method `name' for nil:NilClass): 
2013-12-19T06:31:13.295581+00:00 app[web.1]:  5: <h6>written by <%= post.user.name %> on <%= post.created_at.to_s(:long) %></h6> 
2013-12-19T06:31:13.295778+00:00 app[web.1]: app/views/posts/index.html.erb:3:in `_app_views_posts_index_html_erb__338969566965495969_70155247178440' 
2013-12-19T06:31:13.295778+00:00 app[web.1]:  2: 
2013-12-19T06:31:13.295778+00:00 app[web.1]: 
2013-12-19T06:31:13.295778+00:00 app[web.1]: ActionView::Template::Error (undefined method `name' for nil:NilClass): 
2013-12-19T06:31:13.295778+00:00 app[web.1]: 
2013-12-19T06:31:13.295778+00:00 app[web.1]:  3: <% @posts.each do |post| %> 
2013-12-19T06:31:13.295778+00:00 app[web.1]: 
2013-12-19T06:31:13.295581+00:00 app[web.1]:  8: <% if current_user.has_role? :admin %> 
2013-12-19T06:31:13.295581+00:00 app[web.1]: app/views/posts/index.html.erb:5:in `block in _app_views_posts_index_html_erb__338969566965495969_70155247178440' 
2013-12-19T06:31:13.295778+00:00 app[web.1]:  5: <h6>written by <%= post.user.name %> on <%= post.created_at.to_s(:long) %></h6> 
2013-12-19T06:31:13.295778+00:00 app[web.1]:  6: <div><%= post.body.html_safe %></div> 
2013-12-19T06:31:13.295947+00:00 app[web.1]:  7: <% if user_signed_in? %> 
2013-12-19T06:31:13.295947+00:00 app[web.1]:  8: <% if current_user.has_role? :admin %> 
2013-12-19T06:31:13.295947+00:00 app[web.1]: app/views/posts/index.html.erb:5:in `block in _app_views_posts_index_html_erb__338969566965495969_70155247178440' 
2013-12-19T06:31:13.295947+00:00 app[web.1]: app/views/posts/index.html.erb:3:in `_app_views_posts_index_html_erb__338969566965495969_70155247178440' 
2013-12-19T06:31:13.295778+00:00 app[web.1]:  4: <h2 class='subheader'><%= link_to post.title, post %></h2> 
2013-12-19T06:31:13.295947+00:00 app[web.1]: 
2013-12-19T06:31:13.295947+00:00 app[web.1]: 
2013-12-19T06:31:13.303637+00:00 heroku[router]: at=info method=GET path=/posts host=www.kettlecreekventure.com fwd="64.114.175.126" dyno=web.1 connect=8ms service=25ms status=500 bytes=1266 
2013-12-19T06:31:14.630725+00:00 heroku[router]: at=info method=GET path=/favicon.ico host=www.kettlecreekventure.com fwd="64.114.175.126" dyno=web.1 connect=1ms service=4ms status=200 bytes=0 
2013-12-19T06:31:22.445573+00:00 heroku[run.7634]: Process exited with status 0 
2013-12-19T06:31:22.459444+00:00 heroku[run.7634]: State changed from up to complete 

同樣,代碼工作完全在我的本地計算機上,但失敗後,我有上述錯誤部署到Heroku。當應用程序嘗試引用post.user.name時,index.html.erb文件中出現錯誤。我正在試圖弄清楚自己的頭髮。 如果有人能看到我的問題在哪裏,我將不勝感激。我究竟做錯了什麼?

+0

當您嘗試訪問索引頁時,您可以從Heroku添加Web服務器日誌的輸出嗎? – Beartech

+0

我添加了Heroku日誌 –

+0

生產中的相同問題,使用rails 4.1.4。我不使用heroku,但生產中的相同問題和數據與開發和分期仍然相同 – carbonr

回答

1

根據你的更新,我會提出這個建議:每次你刪除一個有帖子的用戶,然後嘗試列出他們的帖子<%= post.user.name %>將返回零,因爲這篇文章不再有用戶參考。您可以使用

has_many :posts, dependent: :destroy 

在用戶模型正如我前面所說,或者你添加一些功能,以用戶的刪除試圖查看自己的崗位時,以防止出現錯誤。一些選擇是:

當用戶被刪除時,您可以刪除除用戶表中該行的名稱和ID之外的所有內容,這將允許您有<%= post.user.name %>返回一個值。

當用戶被刪除時,您可以刪除其用戶表信息中的所有內容,並添加「-user-deleted」,類似於Tumblr在用戶停用其帳戶時所做的操作,而其名稱顯示在某個帖子中其他Tumblr。

您可以在數據庫中創建一個名爲「用戶刪除」的用戶,並讓該用戶繼承刪除用戶的每篇文章。在用戶控制器中,在您的delete操作中添加一些內容,將其帖子中的user_id字段更改爲「用戶已刪除」帳戶。

或者最後你可能只是檢查,看看是否post.user返回一個值,如果不只是打印出類似這樣

這種「用戶不再存在於系統中」更是全部依賴當然。如果甚至想讓用戶被刪除但仍然保留他們的帖子。如果這不僅僅是一個課程項目,或者你只是爲了學習Rails而做的事情,那肯定是一個可能的情況。希望這可以幫助。這當然讓我想到了允許用戶刪除他們的個人資料而沒有適當的地方清理他們的陷阱。

0

看起來我可能在Heroku DB中有一些損壞的數據。 我最終通過導軌控制檯刪除了所有現有的帖子。現在一切工作正常!

我跑 @posts = Post.all @ posts.each do | post | post.destroy end

然後,我繼續前進,沒有任何問題的新帖。問題是我刪除了一個用戶,但沒有相應的帖子

+0

也許你應該在User模型中擁有'has_many:posts,dependent :: destroy'? – Beartech

+0

我想過,但我不想因爲用戶被刪除而刪除帖子。 –

相關問題