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

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

ただいまの
回答率

90.53%

  • Ruby

    7622questions

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

  • Ruby on Rails

    7231questions

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

  • Ruby on Rails 4

    2431questions

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

  • Amazon EC2

    123questions

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

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

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,412

Tiktak

score 46

前提・実現したいこと

 Ruby On Railsで英語の参考書レビューサイトを開発しています。
 参考書の検索はAmazon APIを使用しています。

発生している問題・エラーメッセージ

問題は、レビューを投稿する画面で、どのようにamazonの本情報を引き出してこればいいかということです。
このサービスの流れは、
検索フォームから参考書を検索→レビューする本を選択→レビューを投稿する
なのですが、この「レビューする本を選択」から「レビューを投稿する」までの流れをどのように実装すれば良いか分からず躓いている状況です。
amazon apiを使用して検索しているので、ユーザが選択した参考書の情報を、レビュー投稿画面のフォームにも反映できる方法があればご教授頂けないでしょうか?
宜しくお願い致します。

ソースコード

コードはまだ不完全で、本を検索して、タイトルとamazonのurlをbookテーブルに保存するだけのものですが、現在できているのはほぼこれだけですので、貼らせていただきます。

def search
    if params[:keyword].present?
      #デバックログ出力するために記述
      Amazon::Ecs.debug = true

      # Amazon::Ecs::Responceオブジェクトの取得
      books = Amazon::Ecs.item_search(
        params[:keyword],
        search_index:  'Books',
        dataType: 'script',
        response_group: 'ItemAttributes, Images',
        country:  'jp',
        power: "Not kindle"
      )

      # 本のタイトル,画像URL, 詳細ページURLの取得
      @books = []

      books.items.each do |item|
        # book = Book.new(
        #   item.get('ItemAttributes/Title'),
        #   item.get('LargeImage/URL'),
        #   item.get('DetailPageURL')
        # )
        book = Book.new()
        book.title = item.get('ItemAttributes/Title')
        book.amazon_url = item.get('DetailPageURL')

        book.save
        @books << book
      end
    end
  end

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Chironian

    2016/01/07 23:47

    すいません。回答依頼を頂きましたが、Rubyについては知識がありません。

    キャンセル

  • Tiktak

    2016/01/08 11:16

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

    キャンセル

回答 1

0

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

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

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

# model/book.rb
〜前略〜
validates :amazon_book_id, uniqueness: true
〜後略〜

# controllers/book_controller.ruby
def search
  〜前略〜
  # 本のタイトル,画像URL, 詳細ページURLの取得
  @books = []

  books.items.each do |item|
    book = Book.find_or_initialize_by(amazon_book_id: item.get('ItemAttributes/ID'))# ここのItemAttributes/IDにAmazonで管理しているほんのユニークIDが入っていると仮定
    book.title = item.get('ItemAttributes/Title') # すでに存在している場合はここを更新する。
    book.amazon_url = item.get('DetailPageURL')
    if book.save
      @books << book
    else
      # 失敗した時の処理
    end
  end
end

# views/books/search.html.erb
<% @books.each do |book| %>
  <!-- bookの内容を表示させる -->
  <%= link_to "レビュー", new_review_path(book_id: book.id) %>
<% end %>

# controllers/review_controller.rb

def new
  @review = Review.new
  @book = Book.find(params[:book_id])
end


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/11 17:17

    rifuchさん、ご丁寧なご回答どうもありがとうございます!

    なるほど、バリデーションは本の情報の中にASINコードなどの固有情報が入っていると思うので、それでいけそうです!

    あと、この質問をさせて頂いた時点では、コードにある通りAmazon APIで取得した本をすべてデータベースに保存するように書いていたのですが、ユーザがレビューをするボタンをクリックしたもののみ、クリックされたタイミングで保存する仕様に変更しました(これもどちらが良いのかは正直わかっていません)。

    もしよろしければ、
    1 Amazon APIで検索された本情報をすべて保存する
    2 検索された本情報の中で、レビューボタンをクリックされたもののみ保存する
    のどちらの方が仕様的に良いかなどありましたら、rifuchさんのご意見をお聞かせ頂いても宜しいでしょうか?

    キャンセル

  • 2016/01/12 00:16

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

    キャンセル

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

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Flickrawの使い方について

    Rails、API初心者です。 Flickrawの使い方について質問です。 下記のリンク記事を参考にFlickrawの導入を考えています。 http://shmztkyk.ha

  • 解決済

    Rails テスト rspec

    Ruby on Rails のテストについてですが 生成されたtopページのhtmlの中身の文字列を何かと比較するテストを作成したいのですがどのように書いていけば良いかわかり

  • 解決済

    activerecord-import(multi-level)の使い方

    activerecord-import(multi-level)の使い方で悩んでいます。 実験用のコードを書いてみましたが、思うようにデータベースが更新されません。 コードの書

  • 解決済

    railsでのコメント返信機能について

    前提・実現したいこと railsでコメント機能つきブログを作成しています。 コメントには返信機能もつけようと思っているのですが、実装方法で悩んでいます。 コメント1

  • 解決済

    膨大な量のページを作る手間を省きたい

    現在Railsで掲示板のようなサービスを作っていて、掲示板に投稿するときに性別、年代、地域、などのプロフィールを入力できるようになっています。 そこで投稿をプロフィール毎に分

  • 解決済

    carrierwaveを使ってAWS S3に画像をあげる(rails s でエラーが出る)

    gem 'fog'とcarrierwaveを利用して画像をAWS S3に保存しようとしたのですがrails sで試してみようとすると以下のエラーが出て立ち上がりません。 アプリケ

  • 解決済

    【Ruby on Rails】paramsに初期値をセットしたい

    初歩的なことで恐れ入ります。 ビューからパラメータ(日付のFromとTo)を受け取り、両方とも空だった場合は  初期値として現在日をセットして表示したいです。 そこで

  • 解決済

    Ruby on rails 5.1.1 jQuery ajax が機能しない

    セレクトボックスでajaxを用いて、選択肢を絞りたい。 ですが、サイトの指示通りにやってもうまくうごきません。 【Rails】セレクトボックスの内容をAjaxを使用して動的

同じタグがついた質問を見る

  • Ruby

    7622questions

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

  • Ruby on Rails

    7231questions

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

  • Ruby on Rails 4

    2431questions

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

  • Amazon EC2

    123questions

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