2013-01-04 97 views
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 

有沒有人碰到這個纔來知道如何解決它?

感謝

+0

模塊不能被實例化REF: - 。http://marakana.com/bookshelf/ruby_tutorial /modules.html – Salil

回答

3

模塊的問題來自於你使用的Book.new

書是一個模塊(圖書:: BookFinder),並且不能被實例化。

書裏面的方法:: BookFinder現在被混合到控制器中,並在書:: BookFinder任何方法可以直接在控制器上調用,而不必實例書:: BookFinder。

如果你真的希望這是一個對象使用class,而不是模塊。

更新: 你顯然不能用類替換模塊。 但是,如果你想有一個可以新設置屬性一個對象簿上,你需要編寫一個類(和刪除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類的一些教程和這些東西是如何工作的

+0

感謝您的詳細解答,併爲她的新手提問e但我會在哪裏上課?用班級替換模塊?這不符合預期的模塊? – Richlewis

+0

我添加了一些示例代碼 – Tigraine

+0

將在教程馬上尋找,感謝您的幫助 – Richlewis

0

你不能例如在紅寶石