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

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

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

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

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

Q&A

1回答

4030閲覧

Ruby on RailsでのAmazon APIを使用した参考書レビューサイトの開発について

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

0グッド

0クリップ

投稿2016/01/07 13:58

###前提・実現したいこと
Ruby On Railsで英語の参考書レビューサイトを開発しています。
参考書の検索はAmazon APIを使用しています。

###発生している問題・エラーメッセージ
問題は、レビューを投稿する画面で、どのようにamazonの本情報を引き出してこればいいかということです。
このサービスの流れは、
検索フォームから参考書を検索→レビューする本を選択→レビューを投稿する
なのですが、この「レビューする本を選択」から「レビューを投稿する」までの流れをどのように実装すれば良いか分からず躓いている状況です。
amazon apiを使用して検索しているので、ユーザが選択した参考書の情報を、レビュー投稿画面のフォームにも反映できる方法があればご教授頂けないでしょうか?
宜しくお願い致します。
###ソースコード
コードはまだ不完全で、本を検索して、タイトルとamazonのurlをbookテーブルに保存するだけのものですが、現在できているのはほぼこれだけですので、貼らせていただきます。

ruby

1def search 2 if params[:keyword].present? 3 #デバックログ出力するために記述 4 Amazon::Ecs.debug = true 5 6 # Amazon::Ecs::Responceオブジェクトの取得 7 books = Amazon::Ecs.item_search( 8 params[:keyword], 9 search_index: 'Books', 10 dataType: 'script', 11 response_group: 'ItemAttributes, Images', 12 country: 'jp', 13 power: "Not kindle" 14 ) 15 16 # 本のタイトル,画像URL, 詳細ページURLの取得 17 @books = [] 18 19 books.items.each do |item| 20 # book = Book.new( 21 # item.get('ItemAttributes/Title'), 22 # item.get('LargeImage/URL'), 23 # item.get('DetailPageURL') 24 # ) 25 book = Book.new() 26 book.title = item.get('ItemAttributes/Title') 27 book.amazon_url = item.get('DetailPageURL') 28 29 book.save 30 @books << book 31 end 32 end 33 end

###補足情報(言語/FW/ツール等のバージョンなど)

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

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

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

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

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

Chironian

2016/01/07 14:47

すいません。回答依頼を頂きましたが、Rubyについては知識がありません。
退会済みユーザー

退会済みユーザー

2016/01/08 02:16

Chironianさん、ちゃんと確認せずにご依頼してしまい申し訳ありません>< わざわざこちらにコメント頂きありがとうございます。 また今後ご機会がありましたら、よろしくお願い致します!
guest

回答1

0

@booksにAmazonで検索してきた結果を保存したデータが入っているので、検索結果からレビューする本を選択するときに、book.idを渡してあげればすむかと。

ただし、提示頂いたソースでは、保存に失敗した時も検索結果に反映されてしまうし、重複して保存され続けてしまうので、そこのあたりはうまい事処理してあげる必要がありそうですね。

Amazon::Ecsの事はよくわかりませんが、「本」に対してユニークなIDが、検索結果に入っていないでしょうか?
入っているとしたら、モデルのバリデーションでその値にユニーク制限を掛け、saveではなく、find_or_create_byかfind_or_initialize_byなどで処理してあげると良いでしょう。

Ruby

1# model/book.rb 2〜前略〜 3validates :amazon_book_id, uniqueness: true 4〜後略〜 5 6# controllers/book_controller.ruby 7def search 8 〜前略〜 9 # 本のタイトル,画像URL, 詳細ページURLの取得 10 @books = [] 11 12 books.items.each do |item| 13 book = Book.find_or_initialize_by(amazon_book_id: item.get('ItemAttributes/ID'))# ここのItemAttributes/IDにAmazonで管理しているほんのユニークIDが入っていると仮定 14 book.title = item.get('ItemAttributes/Title') # すでに存在している場合はここを更新する。 15 book.amazon_url = item.get('DetailPageURL') 16 if book.save 17 @books << book 18 else 19 # 失敗した時の処理 20 end 21 end 22end 23 24# views/books/search.html.erb 25<% @books.each do |book| %> 26 <!-- bookの内容を表示させる --> 27 <%= link_to "レビュー", new_review_path(book_id: book.id) %> 28<% end %> 29 30# controllers/review_controller.rb 31 32def new 33 @review = Review.new 34 @book = Book.find(params[:book_id]) 35end

とまあ、こんな感じでしょうか。

投稿2016/01/11 01:40

rifuch

総合スコア1901

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

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

退会済みユーザー

退会済みユーザー

2016/01/11 08:17

rifuchさん、ご丁寧なご回答どうもありがとうございます! なるほど、バリデーションは本の情報の中にASINコードなどの固有情報が入っていると思うので、それでいけそうです! あと、この質問をさせて頂いた時点では、コードにある通りAmazon APIで取得した本をすべてデータベースに保存するように書いていたのですが、ユーザがレビューをするボタンをクリックしたもののみ、クリックされたタイミングで保存する仕様に変更しました(これもどちらが良いのかは正直わかっていません)。 もしよろしければ、 1 Amazon APIで検索された本情報をすべて保存する 2 検索された本情報の中で、レビューボタンをクリックされたもののみ保存する のどちらの方が仕様的に良いかなどありましたら、rifuchさんのご意見をお聞かせ頂いても宜しいでしょうか?
rifuch

2016/01/11 15:16

細かい仕様や要求がわからないので一概に言えませんが、私だったら本の情報はモデルにせず、レビューにAmazonから取得出来るユニークコードを格納し、本の情報が必要な場合にはAmazonAPIから取得するようにするでしょうね。 Book情報はAmazonから取得するもので、最終的にはAmazonの書籍DBのコピーを保持するのと同じ意味になってしまいますから。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問