我之前从未见过这条错误消息
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
之前有没有人遇到过这个并且知道如何修复它?
由于
答案 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中实例化模块