Rails GoogleのAPIで表示したデータを保存する

APIのデータは取得した型でそのままコントローラに送るとエラーになります。

f:id:happy_teeth_ago:20180614122754p:plain

nilが渡ってしまう。

リンクしたときに、DBに保存したい。

createを呼ぶべき。createはpostなので、formを利用しないといけない。

<div class="w3-row-padding w3-padding-16 w3-center">
<%= @books.each do |book| %> <//ここでもらった仮引数を詰め込みます。
<%= form_for(book) do |f| %>

<div class="w3-quarter">
<%= book.title %>
<%= book.author %>
<%= book.publish %>
<%= book.published %>
<%= link_to image_tag("#{book.image_link}"),
new_book_path(book) %>
<%= f.hidden_field :title %>
<%= f.hidden_field :author %>
<%= f.hidden_field :publish %>
<%= f.hidden_field :published %>
<%= f.hidden_field :image_link %>

<i class="fas fa-pencil-alt"><%= f.submit value="シェアする"%></i>
</div>
<% end %>
<% end %>
</div>

formタグは、hiddenにできます。とりあえずformタグを利用することが大切。

DBに保存する必要はないです。indexは取得するだけなので、

eachともちろん併用できます。each文の中で回さないと意味がないです。仮引数でループ回していくので。

 

標準のscafforldingを見て参照すると良い。//=>大切です。

_from.html.erbを参照する。 

そこには、このように記載してあります。

<%= form_with(model: book, local: true) do |f| %>

 formを回しなさいということですね。

 

form_forを確認すると、

form_for(モデルオブジェクト [, オプション]) do |f|
end

第1引数はオブジェクト名、第2引数は?

モデルにオブジェクトが入っていれば、それを保存するというのがfromの仕様になっているよう。なので、値を入れておかないといけない。

@booksに入っているのがGoogleAPIの型になっている。

 これが1番の問題。

これを解決するために、取得したあと、DBに書き込まずにモデルだけ作るのはどうか?。行けそうである。

mapを利用する。一度に変換してしまう。

なんて素晴らしいmap!

すべてがオブジェクトのRubyも素晴らしい!

 

def index
@books = GoogleBooks.search(params[:search],{:count => 20}).map{|googlebook| book = Book.new
book.title = googlebook.title
book.author = googlebook.authors
book.publish = googlebook.publisher
book.published = googlebook.published_date
book.image_link = googlebook.image_link
book
}
end

一度mapの中で変数に入れないといけない。仮引数をgoogleBookにします。

Book.newはスタティックな値なので大文字。

あとは値を詰め込むだけ。

mapの中で返却しないといけない。

なのでbookは必要です。

ストロングパラメータでないと、ハッシュは詰め込めないので、別途ストロングパラメータを設定しておく。

 

ポイントは

1-GoogleBookのモデルを、ActiveRecordの型でオブジェクト作り直しました。

もうオブジェクト作ったので、formも簡単に作れます!

2-createはpost。そのためには、formが必要なのでformを作成しました。