Rails:Method返回对象而不是属性

时间:2013-02-10 10:20:58

标签: ruby-on-rails rails-activerecord

我正在构建我的第一个Rails应用程序,并且我发疯了,知道这可能是一个简单的修复。我无法从方法中返回正确的对象和属性。我有三种模式:用户,订阅和订阅。

用户:

class User < ActiveRecord::Base
.
.
  has_many :subscriptions, dependent: :destroy
  has_many :feeds, through: :subscriptions

  def subscribe!(feed_id)
    subscriptions.create!(feed_id: feed.id)
  end
end

订阅:

class Subscription < ActiveRecord::Base
.
.
  belongs_to :user, class_name: "User"
  belongs_to :feed, class_name: "Feed"

  validates :user_id, presence: true
  validates :feed_id, presence: true
end

进给量:

class Feed < ActiveRecord::Base
.
.
  belongs_to :subscriptions

  def self.create_feed(feed_url)
    feed = Feedzirra::Feed.fetch_and_parse(feed_url)

    unless exists? :feed_url => feed.url
      create!(
        :title => feed.title,
        :feed_url => feed.feed_url,
        :url => feed.url,
        :etag => feed.etag,
        :last_modified=> feed.last_modified
      )
    end
  end
end

每当我从控制台显式调用user.subscriptions.create!(feed)时它就可以正常工作,但使用它的测试不会通过。有问题的测试:

describe "subscribing" do
  let(:feed) { Feed.create_feed("http://www.somevalidfeed.com/feed/") }
  before { @user.subscribe!(feed) }
end

返回:

NameError: undefined local variable or method `feed' for #<User:0x007f9c951b3b98>

我不明白为什么这会返回一个对象,或者为什么它试图找到User的id而不是传递给它的Feed对象。搜索了几个小时后,我似乎无法指出正确的方向,所以任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:0)

可能是这里的问题:

  def subscribe!(feed_id)
    subscriptions.create!(feed_id: feed.id)
  end

可能你的意思是

  def subscribe!(feed_id)
    subscriptions.create!(feed_id: feed_id)
  end

甚至

  def subscribe!(feed)
    subscriptions.create!(feed_id: feed.id)
  end

答案 1 :(得分:0)

User课程中,我认为您的订阅方法有误,应该是

def subscribe!(feed)
  subscriptions.create!(feed_id: feed.id)
end