ruby 2.5.8 rails 5.2.4 Bootstrap 3.4
Cliquez sur le titre
Les valeurs sont définies dans le formulaire et vous pouvez facilement enregistrer des livres.
On suppose que BooksController a été créé.
La première est la fonction de recherche de livre. Cette fois, j'utiliserai l'API Google Book pour enregistrer des livres. Je décrirai donc la fonction de recherche dans la nouvelle action.
books_controller
def new
@book = Book.new
#Traitement de l'API de recherche de livres
if params[:keyword].present?
require 'net/http'
url = 'https://www.googleapis.com/books/v1/volumes?q='
request = url + params[:keyword]
enc_str = URI.encode(request)
uri = URI.parse(enc_str)
json = Net::HTTP.get(uri)
@bookjson = JSON.parse(json)
count = 5 #Numéro à afficher dans les résultats de recherche
@books = Array.new(count).map{Array.new(4)}
count.times do |x|
@books[x][0] = @bookjson.dig("items", x, "volumeInfo", "title")
@books[x][1] = @bookjson.dig("items", x, "volumeInfo", "imageLinks", "thumbnail")
@books[x][2] = @bookjson.dig("items", x, "volumeInfo", "authors")
@books[x][2] = @books[x][2].join(',') if @books[x][2] #Séparez les auteurs par des virgules
@books[x][3] = @bookjson.dig("items", x, "volumeInfo", "industryIdentifiers", 0, "identifier")
end
end
end
L'API GoogleBook n'a pas besoin d'être enregistrée
Si vous donnez un mot de recherche à https: //www.googleapis.com/books/v1/volumes? Q =
, les résultats de la recherche seront renvoyés au format json.
Lors de la recherche avec Rails, cela ressemble à ceci ↓ https://www.googleapis.com/books/v1/volumes?q=rails
Le json acquis est converti en hachage à l'aide de JSON.parce, et la valeur souhaitée en est extraite.
Vous pouvez aussi l'obtenir avec @bookjson [" items "] [x] [volumeInfo] [title]
, mais si certaines données n'existent pas, NoMethodError se produira. La gestion des exceptions peut être effectuée par branchement conditionnel, mais c'est un peu redondant.
Je creuse donc le hachage en utilisant la méthode dig. S'il n'y a pas de valeur correspondant à la clé, elle renverra nil, donc c'est sûr.
Créez une fenêtre de recherche et un champ de résultats de recherche dans la vue.
ruby:new.html.erb
<h1>Nouvel enregistrement des livres</h1>
<%= form_tag('/booksearch', method: :get) do %>
<div class="input-group">
<%= search_field_tag "keyword", params[:keyword], class: "form-control", placeholder: "Recherche par mot clé" %>
<span class="input-group-btn">
<%= submit_tag "Chercher", class: "btn btn-primary" %>
</span>
</div>
<% end %>
<h2>Résultats de recherche</h2>
<% if @books.present? %>
<% @books.each do |book| %>
<img src="<%= book[1] %>" width="40" vspace="2">
<%= book[0] %> |
<%= book[2] %> |
<%= book[3] %> <br>
<% end %>
<% end %>
Écrivons également le routage de la fenêtre de recherche
routes.rb
resources :books
get '/booksearch', to: 'books#new'
Ceci termine la fonction de recherche.
Ensuite, préparez le formulaire d'inscription du livre.
ruby:new.html.erb
<%= form_with scope: :book, url: books_path, local: true do |form| %>
<%= render 'shared/error_messages' %>
<%= form.label :title %>
<%= form.text_field :title, class: 'form-control', value: "#{@title}" %>
<%= form.label :author %>
<%= form.text_field :author, class: 'form-control', value: "#{@author}" %>
<%= form.label :code %>
<%= form.text_field :code, class: 'form-control', value: "#{@code}" %>
<%= form.hidden_field :img, class: 'form-control', value: "#{@img}" %
<%= form.submit "Save Book", class: "btn btn-primary" %>
<% end %>
Le fait est qu'il s'agit de value:" # {@ title} "
, et qu'il reçoit la valeur.
L'URL de la vignette de l'image est reçue par hidden_field
car elle n'a pas besoin d'être modifiée.
Créez un mécanisme pour soumettre des valeurs au formulaire.
ruby:new.html.erb
...
<img src="<%= book[1] %>" width="40" vspace="2">
<%= link_to book[0], controller: "books", action: "new", title: book[0], code: book[3], author: book[2], img: book[1] %>
<%= book[2] %> |
...
Collez le lien avec la requête dans le livre [0](* titre du livre) affiché dans les résultats de recherche précédents. Cela enverra la valeur au contrôleur.
books_controller
def new
...
@title = params[:title] if params[:title].present?
@code = params[:code] if params[:code].present?
@author = params[:author] if params[:author].present?
@img = params[:img] if params[:img].present?
end
Ajout du processus de réception des paramètres de requête à la nouvelle action. Stocker dans les variables d'instance pour les vues (formulaires).
Ceci est complet. Si vous avez des questions, laissez un commentaire.
Recommended Posts