困っていること
楽天APIを使って書籍のデータを取得し、booksテーブルに登録を行っています。
複数機能があって、booksに未登録の場合はbooksに登録するようにコードを書いています。
共通化するために、最初はhelperに記載して問題なかったのですが、helperはviewから呼び出すものだとしり、
別の方法で対処しようとしているのですがやり方がわかりません
必ずしもこのやり方でやる必要があるわけでもなく、modelに記載するような形でも構いません(その場合でも、どのような記述がベストなのかほとんど見通しがたっていないのですが…)。
ご存知の方おられましたら、ご教示お願い致します。
Helper記載内容
module BooksHelper RakutenWebService.configure do |c| c.application_id = ENV['RAKUTEN_APPID'] end def createbook(isbn) @book = Book.find_or_initialize_by(isbn: isbn) results = RakutenWebService::Books::Book.search(isbn: @book.isbn) @book = Book.new(read(results.first)) end private def read(result) { title: result['title'], author: result['author'], publishername: result['publisherName'], image_url: result['largeImageUrl'], rakuten_url: result['itemUrl'], isbn: result['isbn'] } end end
###試したこと
concernで共通化できるということだったので、試してみたのですが、エラーが出力され、どうしていいかわかりませんでした。
app/controllers/concerns.createbook.rb
module CreateBook extend ActiveSupport::Concern RakutenWebService.configure do |c| c.application_id = ENV['RAKUTEN_APPID'] end def createbook(isbn) Book.find_or_initialize_by(isbn: isbn) results = RakutenWebService::Books::Book.search(isbn: @book.isbn) Book.new(read(results.first)) end private def read(result) { title: result['title'], author: result['author'], publishername: result['publisherName'], image_url: result['largeImageUrl'], rakuten_url: result['itemUrl'], isbn: result['isbn'] } end end
app/controllers/bookshelves_controller.rb (呼び出す側のコントローラー)
class BookshelvesController < ApplicationController include CreateBook before_action :correct_user, only: %i[edit update destroy] def create if params[:bookshelf][:book_id].empty? createbook(params[:isbn]) @book.save @bookshelf = current_user.bookshelves.build(bookshelf_params) @bookshelf.book_id = @book.id @bookshelf.save else @bookshelf = current_user.bookshelves.build(bookshelf_params) @bookshelf.save @book = Book.find(params[:bookshelf][:book_id]) end end end
エラー出力内容
ActionController::RoutingError (uninitialized constant BookshelvesController::CreateBook):
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。