模块rails中的未定义方法

时间:2013-01-04 11:53:30

标签: ruby-on-rails ruby-on-rails-3 methods module undefined

我之前从未见过这条错误消息

undefined method `new' for Book:Module

并且想知道是否有人知道我为什么会得到它,我的第一个想法是命名惯例但不确定

我有一个模块

  module Book::BookFinder

  BOOK_URL = 'https://itunes.apple.com/lookup?isbn='

  def book_search(search)
  response = HTTParty.get(BOOK_URL + "#{search}", :headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json' })
 results = JSON.parse(response.body)["results"]
end

end

然后将其包含在我的控制器中

 class BookController < ApplicationController
 before_filter :authenticate_admin_user!
 include Book::BookFinder


 def results
 results = book_search(params[:search])
 @results = results
 @book = Book.new
 @book.author = results[0]["artistName"]

end

def create
@book = Book.new(params[:book])
 if @book.save
redirect_to @book, notice: 'Book was successfully saved'
 else
render action:new
end
end
end

之前有没有人遇到过这个并且知道如何修复它?

由于

2 个答案:

答案 0 :(得分:3)

问题来自您使用Book.new

Book是一个模块(Book :: BookFinder),无法实例化。

Book :: BookFinder中的方法现在混合到您的控制器中,Book :: BookFinder中的任何方法都可以直接在控制器上调用,而无需实例Book :: BookFinder。

如果你真的希望这个对象使用class而不是模块。

更新: 你显然不能只用类替换模块。 但是如果你想拥有一个可以新建的属性Book并设置属性,你需要为它编写一个类(并删除你现在用于模块的include Book::BookFinder

样本calss看起来像这样:

class Book
  def initialize
    # put constructor logic here
  end

  def some_method
    # methods that can be called on the instance
    # eg:
    # @book = Book.new
    # @book.some_method
  end

  # defines a get/set property
  attr_accessor :author
  # allows assignment of the author property
end

希望这会有所帮助,但我强烈建议您查看一些有关Ruby类的教程以及这些内容的工作原理。

答案 1 :(得分:0)

你不能在Ruby中实例化模块