Rails GoogleのAPIで表示したデータを保存する
APIのデータは取得した型でそのままコントローラに送るとエラーになります。
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を作成しました。