2013-04-12 17 views
1

任何人都知道我可以如何解決這個錯誤?下面是詳細信息 -未定義的方法`更新'爲零:NilClass

錯誤消息:

NoMethodError in PostsController#create 
undefined method `update' for nil:NilClass 

的PostsController創建:

class PostsController < ApplicationController 

    def create 
    @twitter_user.update(@post.content) 
    end 

這裏的@twitter_user是如何在我的user.rb模型中定義

def twitter 
    unless @twitter_user 
     provider = self.authentications.find_by_provider('twitter') 
     @twitter_user = Twitter::Client.new(:token => provider.token, :secret => provider.secret) rescue nil 
    end 
    @twitter_user 
    end 

感謝

+1

在你的PostsController的'create'方法,只是那怎麼'@ twitter_user'變量會被分配它的價值呢? – buruzaemon

+0

- >您必須先創建@twitter_user的新實例。或者你想要的東西像User.twitter.update ...請給更多的信息;) – tingel2k

+0

也許你更''current_user.twitter'而不是'@ twitter_user'? –

回答

0

模型和控制器不共享實例變量,因此PostsController中的@twitter_userUser類中的那個不相同(我猜想它派生來自ActiveRecord::Base)。您必須在控制器內初始化@twitter_user

你可以重構你的代碼是這樣的:

class User < ActiveRecord::Base 
    def twitter_user 
    provider = self.authentications.find_by_provider('twitter') 
    Twitter::Client.new(:token => provider.token, 
         :secret => provider.secret) 
    rescue 
    return nil 
    end 
end 

class PostsController < ApplicationController 
    def create 
    # I suppose your User instance is accessible 
    # through the method current_user 
    @twitter_user = current_user.twitter_user 
    @twitter_user.update(@post.content) 
    end 
end 
3

如果您的用戶模型中定義了@twitter_user,則無法在控制器中訪問它。具有@前綴的方法中的變量屬於該類的一個實例。

如果您要訪問@twitter_user控制器,或許,Twitter的方法轉移到應用控制器:

class ApplicationController 
    def twitter 
    unless @twitter_user 
     provider = User.find_by_provider('twitter') 
     @twitter_user = Twitter::Client.new(:token => provider.token, :secret => provider.secret) rescue nil 
    end 
    @twitter_user 
    end 
end 

然後你就可以用twitter訪問它在任何控制器方法:

class PostsController < ApplicationController 

    def create 
    twitter.update(@post.content) 
    end 
相關問題