NoMethodError - 未定义的方法错误 - ActiveRecord

时间:2014-01-11 17:56:53

标签: ruby-on-rails rails-activerecord

我想返回一个随机网页,我可以将其显示为视图中的链接,但我无法让方法正常工作:

错误:

NoMethodError: undefined method `randomize_webpages' for #<ActiveRecord::Relation::ActiveRecord_Relation_Webpage:0x00000101d84e68>

网页模型

 def randomize_webpages
    shuffle.first
 end

WebpagesController

def index
  @webpages = Webpage.all
end

网页的CSV播种机

link
http://www.buzzfeed.com
http://www.reddit.com
http://boston.com
http://phys.org
http://www.popsci.com
http://www.technologyreview.com
http://techcrunch.com

查看Index.html.erb

<%= link_to 'Take Me Anywhere But Here', @random_page %>

4 个答案:

答案 0 :(得分:1)

您需要将方法定义为模型的类方法

class Webpage
  def self.randomize_webpages
    shuffle.first
  end
end

而不是

class Webpage
  def randomize_webpages
    shuffle.first
  end
end

请注意,该方法效率很低。您正在加载所有记录,然后选择一个。有更有效的方法。

一种可能的改进是仅选择ID,然后查询该ID。另一种方法是委托底层驱动程序,假设它支持查询。

答案 1 :(得分:0)

你是不是在randomize_webpages打电话给@webpages,是吗?这是一个集合,所以你必须做@webpages.first.randomize_webpages之类的事情或者迭代它们(你没有包含相关的代码,所以我不知道你想做什么)才能使它工作。

答案 2 :(得分:0)

它必须是一个类方法,然后你可以使用sample

def self.randomize_webpages
  all.sample
end

答案 3 :(得分:0)

您可以为模型添加类方法

class WebPage < ActiveRecord::Base     
  def self.random
    order('RAND()').first
  end
  ....
end

然后你可以从控制器中的WebPage.random调用它,保存到实例变量,并在视图中使用该实例变量。

请注意'RAND()'是特定于MySQL的。如果您不使用MySql,请搜索正确的语法(如果有)