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 に答える