1

任何人都知道我该如何解决这个错误?这里有更多信息——

错误信息:

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

谢谢

4

2 回答 2

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
于 2013-04-12T09:02:53.417 回答
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
于 2013-04-12T09:22:33.433 回答