ruby 2.5.8 rails 5.2.4 Bootstrap 3.4
Klicken Sie auf den Titel
Die Werte werden im Formular festgelegt, und Sie können Bücher einfach registrieren.
Es wird davon ausgegangen, dass BooksController erstellt wurde.
Erstens ist die Buchsuchfunktion. Dieses Mal werde ich die Google Buch-API verwenden, um Bücher zu registrieren, damit ich die Suchfunktion in der neuen Aktion beschreiben kann.
books_controller
def new
@book = Book.new
#Verarbeitung der Buchsuch-API
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 #Nummer, die in den Suchergebnissen angezeigt werden soll
@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] #Trennen Sie mehrere Autoren durch Kommas
@books[x][3] = @bookjson.dig("items", x, "volumeInfo", "industryIdentifiers", 0, "identifier")
end
end
end
Die GoogleBook-API muss nicht registriert werden Wenn Sie "https: //www.googleapis.com/books/v1/volumes? Q =" ein Suchwort geben, werden die Suchergebnisse im JSON-Format zurückgegeben.
Bei der Suche mit Rails ↓ sieht es so aus https://www.googleapis.com/books/v1/volumes?q=rails
Der erfasste JSON wird mit JSON.parce in einen Hash konvertiert und der gewünschte Wert daraus extrahiert.
Sie können es auch mit "@bookjson [" items "] [x] [volumeInfo] [title]" abrufen. Wenn jedoch einige Daten nicht vorhanden sind, tritt NoMethodError auf. Die Ausnahmebehandlung kann durch bedingte Verzweigung erfolgen, ist jedoch etwas redundant.
Also grabe ich den Hash mit der Dig-Methode. Wenn dem Schlüssel kein Wert entspricht, wird null zurückgegeben, sodass er sicher ist.
Erstellen Sie ein Suchfenster und ein Suchergebnisfeld in der Ansicht.
ruby:new.html.erb
<h1>Neue Registrierung von Büchern</h1>
<%= form_tag('/booksearch', method: :get) do %>
<div class="input-group">
<%= search_field_tag "keyword", params[:keyword], class: "form-control", placeholder: "Schlagwortsuche" %>
<span class="input-group-btn">
<%= submit_tag "Suche", class: "btn btn-primary" %>
</span>
</div>
<% end %>
<h2>Suchergebnisse</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 %>
Schreiben wir auch das Routing für das Suchfenster
routes.rb
resources :books
get '/booksearch', to: 'books#new'
Damit ist die Suchfunktion abgeschlossen.
Bereiten Sie als Nächstes das Buchregistrierungsformular vor.
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 %>
Der Punkt ist, dass es value:" # {@ title} "
ist und den Wert erhält.
Die URL der Miniaturansicht des Bildes wird von "hidden_field" empfangen, da sie nicht geändert werden muss.
Erstellen Sie einen Mechanismus zum Senden von Werten an das Formular.
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] %> |
...
Fügen Sie den Link mit der Abfrage in das Buch [0](* Titel des Buches) ein, das in den vorherigen Suchergebnissen angezeigt wurde. Dadurch wird der Wert an die Steuerung gesendet.
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
Der Prozess zum Empfangen von Abfrageparametern wurde zur neuen Aktion hinzugefügt. Speichern Sie in Instanzvariablen für Ansichten (Formulare).
Dies ist abgeschlossen. Wenn Sie Fragen haben, hinterlassen Sie bitte einen Kommentar.
Recommended Posts