質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

1回答

2695閲覧

コントローラーでの処理を共通化する方法

AK12

総合スコア32

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/06/18 13:35

困っていること

楽天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):

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

RakutenWebService.configure do |c|
c.application_id = ENV['RAKUTEN_APPID']
end

こちらについては、config/initializers/rakuten_web_service.rbあたりを作成してやれば自動的に読み込まれます。

readメソッド,createbookメソッドはBookモデルに

ruby

1class Book < ApplicationRecord 2 def self.create_by_isbn(isbn) 3 @book = Book.find_or_initialize_by(isbn: isbn) 4 results = RakutenWebService::Books::Book.search(isbn: @book.isbn) 5 Book.new(read_from_rakuten(results.first)) 6 end 7 8private 9 def self.read_from_rakuten(result) 10 { title: result['title'], 11 author: result['author'], 12 publishername: result['publisherName'], 13 image_url: result['largeImageUrl'], 14 rakuten_url: result['itemUrl'], 15 isbn: result['isbn'] } 16 end 17end

とし、

ruby

1class ExampleController < ApplicationController 2 def create 3 @book = Book.create_by_isbn(params[:isbn]) 4 @bookshelf.book_id = @book.id 5 end 6end

的に使います。

なお、createbookメソッドについては2点気になります。

  1. RailsのModelはcreateというとデータベースの保存まで行うのが一般的であること

保存を行わないのであればbuildnewが一般的
2. Book.find_or_initialize_by(isbn: isbn)の結果を用いていない事が気になります。

ruby

1# Model 2def self.by_isbn(isbn) 3 @book = Book.find_by_isbn(isbn) 4 return @book if @book 5 results = RakutenWebService::Books::Book.search(isbn: @book.isbn) 6 Book.create(read_from_rakuten(results.first)) 7end 8 9# Controller 10def create 11 @bookshelf = current_user.bookshelves.build(bookshelf_params) 12 if params[:bookshelf][:book_id].empty? 13 @book = Book.by_isbn(params[:isbn]) 14 @bookshelf.book_id = @book.id 15 else 16 @book = Book.find(params[:bookshelf][:book_id]) 17 end 18 @bookshelf.save 19end

あたりですかね

投稿2020/06/18 15:20

asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問