0

私は私が言われたRuby理論をもっと読む必要があります。それは素晴らしいですが、私が読んだほとんどの文献は非​​常に高いレベルで説明されており、私はそれを理解していません。だからこれは私を質問と私のコードに導きます

API呼び出しを処理するモジュールがあります

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

私がやりたいのは、著者の値を私のBookモデルに保存することです。エラーメッセージが表示されます

undefined method `new' for Book: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

これは有効な答えだと確信していますが、何が起こっているのか誰かが説明できますか?説明付きの例を見ることは、本の行やテキストの行を読むよりも私にとって有益です。

4

1 に答える 1

1
module Finders

  ## Wrap BookFinder inside another module, Finders, to better organise related
  ## code and to help avoid name collisions
  ## lib/finders/book_finder.rb
  module BookFinder
    def bar
      puts "foo"
    end
  end  
end


## Another BookFinder module, but this one is not wrapped.
## lib/book_finder.rb
module BookFinder
  def foo
    puts 'bar'
  end
end


## Book is a standard Rails model inheriting from ActiveRecord
## app/models/book.rb
class Book < ActiveRecord::Base
  ## Mixin methods from both modules
  include BookFinder
  include HelperLibs::BookFinder
end

## app/controllers/books_controller.rb
class BookController
  def create
    book = Book.new
    book.foo
    book.bar

  end
end


BookController.new.create
 - bar
 - foo

あなたのコードでは、同じ名前のモジュールとクラスを作成しています-これは許可されていません。モジュールは2番目にロードされるため、クラスをオーバーライドします。

于 2013-01-04T14:50:36.930 に答える