В Rails, как я могу создать кнопку, которая сохраняет запись из внешнего API в мою базу данных? - PullRequest
0 голосов
/ 24 января 2019

У меня есть Rails API, который использует внешний интерфейс поиска API с использованием гема HTTParty.С данными, которые возвращаются на мой взгляд, я хотел бы иметь возможность сохранить выбранные записи в моей базе данных.Вроде как функция закладки.Есть ли в любом случае кнопка рядом с каждым элементом результатов поиска, который бы достиг этого?Любая помощь будет принята с благодарностью.Мой текущий код ниже.

Дизайн контроллера:

class DesignsController < ApplicationController
    def index
        @search = Api.new.find(params[:q])['results']
    end
end

Метод класса:

class Api
  include HTTParty
  base_uri "http://search.example.com/searchv2"

  attr_accessor :name, :limit, :offset

  # Find a particular design, based on its name
  def find(name)
    self.class.get("/designs", query: { q: name }).parsed_response
  end
end

Вид:

<h1>Design Search</h1>

<%= form_tag(designs_path, method: :get) do %>
  <%= label_tag(:q, "Search for:") %>
  <%= text_field_tag(:q) %>
  <%= submit_tag("Search") %>
<% end %>

<h2>Search results:</h2>

<% @search.each do |design| %>  
<h3><%= design['name'] %></h3>
<h5><%= image_tag design['thumbnail_url'] %></h5>
<% end %>

Модель:

class Design < ApplicationRecord
end

1 Ответ

0 голосов
/ 24 января 2019

приложение / просмотров / дизайн / index.html.erb:

...
<% @search.each do |design| %>  
  <h3><%= design['name'] %></h3>
  <h5><%= image_tag design['thumbnail_url'] %></h5>
  <%= button_to 'Save',
        designs_path(
          design: design.slice('name', 'thumbnail_url') # etc...
        ),
        method: :post,
        data: { disable_with: 'Loading...' }
  %>
<% end %>

приложение / Config / routes.rb:

resources :designs, only: [:index, :create]

приложение / контроллеры / designs_controller.rb:

class DesignsController < ApplicationController
  # ...
  def create
    @design = Design.new(design_params)
    @design.save!

    # just an example...
    redirect_to designs_path, success: 'Design has been saved!'
  end

  private

  def design_params
    params.require(:design).permit(:name, :thumbnail_url) # etc...
  end
end

Todos:

  • ваша модель Design должна иметь атрибуты, которые вы хотите сохранить (например: :name? И :thumbnail_url?). Я предполагал, что вы уже создали / перенесли эти атрибуты; если нет, добавьте их.
  • , поскольку в моем коде выше все еще есть уязвимость, заключающаяся в том, что любой пользователь может изменить <button> <form action='...'> (т. Е. Они могут изменить «имя» дизайна по своему желанию, когда он будет сохранен), тогда мой Решение, приведенное выше, все еще не является лучшим решением, хотя для простоты, и если предположить, что эта уязвимость не является проблемой для вас, приведенного выше кода уже достаточно.
...