nil的未定义方法`update':NilClass

时间:2013-04-12 08:55:53

标签: ruby-on-rails ruby

任何人都知道如何修复此错误?这是更多信息 -

错误消息:

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

PostsController创建:

class PostsController < ApplicationController

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

以下是我在user.rb模型中定义@twitter_user的方法

  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

由于

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

模型和控制器不共享实例变量,因此@twitter_user中的PostsControllerUser类中的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 1}})。您必须在控制器内初始化{{1}}。

您可以像这样重构代码:

{{1}}