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

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

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

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

Ruby

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

Ruby on Rails

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

Q&A

解決済

3回答

1946閲覧

[Rails]楽天等APIを使用したアプリの設計で適しているのは?

nobu09

総合スコア34

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2019/04/17 09:22

編集2019/04/18 08:29

前提・実現したいこと

楽天API等の外部APIを使用したアプリを作成しています。
現在の設計方針ではAPIを利用する機能をクラスにまとめています。
そして、アプリIDやApiKeyをクラス変数またはinitializeで設定して、それらをapiを使用するメソッドで使い回しています。

使用方法としては、Controllerのbefore_actionで上記のクラスのインスタンスを生成し、各アクションでそのインスタンスメソッドを呼び出しています。

規模は小さいので気にする必要がないかもしれませんが、もっと良い(適した)設計があれば教えていただきたいです。

試したこと

module化やconcernでの実装を考えたのですが、クラスで実装しているようにapikey設定を一ヶ所にまとめる方法が思い付きませんでした。

追記

発生するエラー:
Payjp::AuthenticationError: No API key provided. Set your API key using "Payjp.api_key = <API-KEY>".

現状の問題点

  • コンソールで確認したところ、PayjpObject::Client.api_key=nilになっていました。
  • PayjpObject::Client.request、PayjpObject::Subscription.createにはそれぞれ何を記載すれば良いのでしょうか
  • PayjpObject::Subscription.createに引数を与えるにはどうすれば良いのでしょうか

PayjpのAPIを使用したソースコードは以下になります。

・config/initializers/payjp_object_client.rb

PayjpObject::Client.api_key = ENV["PAYJP_SECRET_KEY"];

・controllers/concerns/payjp_object/client.rb

module PayjpObject class Client class_attribute :api_key def self.request Payjp::Subscription.create end end end

・controllers/concerns/payjp_object/subscription.rb

ruby

1module PayjpObject 2 class Subscription 3 def self.create(attrs) 4 Client.request(Payjp::Subscription.create).map { |attrs| Subscription.new attrs } 5 end 6 7 def find_by(attrs) 8 Client.request(Payjp::Subscription.find_by).map { |attrs| Subscription.new attrs } 9 end 10 end 11end

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

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

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

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

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

guest

回答3

0

エラー:uninitialized constant PayjpObject

これは config/initializers/payjp_object_client.rb で発生しているってことで良いでしょうか?

autoloadが効いてないように思えます。payjp_object.rbというファイルを探してないから、uninitialized constantになっているように思えます。

concerns は extend ActiveSupport::Concern を設定して include するための関連の置き場です。少し使い方が違うように思えます。

投稿2019/04/19 02:45

odyu

総合スコア548

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

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

nobu09

2019/04/19 04:29

なるほど。 修正してみます。
guest

0

ベストアンサー

このような記述方法はどこを参考にすれば良いのでしょうか?

特に書籍などがあった覚えはないですが、経験によるものが大きいかと思います。
なので、一番はやいのはGithubのRailsアプリをコードリーディングするのが一番ですね。

また、リクエストクラスとリソースクラスはなぜmodels配下なのでしょうか?

機能がcontrollerの補助的な役割と考えているので、controllers配下に配置した方が適しているように思いました。

一番はテストをしやすい事ですね。
それとコントローラーは名前のとおりコントロールするものです。
要は旗振りだけを担うものと自分は考えています。
controllerの「補助的な役割」という考え方も悪くないですが、補助的なものはAuthなど認証、認可などの許可するかを判断するものが正しいと考えます。

投稿2019/04/19 02:37

odyu

総合スコア548

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

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

nobu09

2019/04/19 04:28

非常にわかりやすい説明ありがとうございました。 とても勉強になりました。 どうもありがとうございます。
guest

0

参考になれば良いですが、個人的にはできるだけ Rails way に乗っかる方法で実装することが多いですね。

楽天のAPI使ったことないので、適当ですが、例えばこんな感じで単一責任の原則に乗っかていけば自ずと良い設計になるのではないかと思います。

設定の初期化

config/initilaizers/rakuten_client.rb

ruby

1Rakuten::Client.app_id = 'hoge'; 2Rakuten::Client.api_key = 'hoge';

リクエストクラス

app/models/rakuten/client.rb

ruby

1module Rakuten 2 class Client 3 class_attribute :app_id, :api_key 4 5 def self.request 6 # ここでAPIをコールする 7 return [] 8 end 9 end 10end

リソースクラス

app/models/rakuten/book.rb

ruby

1module Rakuten 2 class Book 3 def search 4 Client.request('https://rakuten/api/books').map { |attrs| Book.new attrs } 5 end 6 end 7end

コントローラー

app/controllers/rakuten_books_controller.rb

ruby

1class Rakuten::BooksController < ApplicationController 2 def index 3 @books = Rakuten::Book.search 4 end 5end

投稿2019/04/17 11:08

odyu

総合スコア548

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

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

nobu09

2019/04/18 03:47 編集

ありがとうございます。 無事動作し、コードもスッキリしました。 このような記述方法はどこを参考にすれば良いのでしょうか? また、リクエストクラスとリソースクラスはなぜmodels配下なのでしょうか? 機能がcontrollerの補助的な役割と考えているので、controllers配下に配置した方が適しているように思いました。 追記: 確認手順に問題がありました。 正しく実施したところエラーになってしまいました。 エラー:uninitialized constant PayjpObject コードを追記しました。 よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問