1

我以前从未见过此错误消息

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

有没有人遇到过这个并知道如何解决它?

谢谢

4

2 回答 2

3

问题来自您对Book.new.

Book 是一个模块 (Book::BookFinder) 并且不能被实例化。

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

如果您真的希望这是一个对象,请使用class而不是 Module。

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

示例课程如下所示:

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 类的教程以及这些东西是如何工作的。

于 2013-01-04T11:56:37.217 回答
0

您不能在 Ruby 中实例化模块

于 2013-01-04T11:55:46.610 回答