在 Rails 中,如何创建一个按钮,将来自外部 api 的条目保存到我的数据库中?
In Rails, how can I create a button that saves an entry from an external api into my database?
我有一个 Rails api 使用 HTTParty gem 使用外部设计搜索 api。使用返回到我的视图的数据,我希望能够将选定的条目保存到我的数据库中。有点像书签功能。无论如何在每个搜索结果项旁边都有一个按钮可以实现这一点?任何帮助将不胜感激。我当前的代码如下。
设计控制器:
class DesignsController < ApplicationController
def index
@search = Api.new.find(params[:q])['results']
end
end
Class方法:
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
app/views/designs/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 %>
app/config/routes.rb:
resources :designs, only: [:index, :create]
app/controllers/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
待办事项:
- 您的
Design
模型需要具有您想要保存的属性(即::name
?和 :thumbnail_url
?)。我的假设是您已经拥有 created/migrated 这些属性;如果还没有,请添加它们。
- 因为我上面的代码中仍然存在漏洞,任何用户都可以修改
<button>
的 <form action='...'>
(即他们可以根据需要修改设计的 "name"当它被保存时),那么我上面的解决方案仍然不是最好的解决方案,尽管为了简单起见并且假设这个漏洞对你来说不是问题,那么上面的代码已经足够了。
我有一个 Rails api 使用 HTTParty gem 使用外部设计搜索 api。使用返回到我的视图的数据,我希望能够将选定的条目保存到我的数据库中。有点像书签功能。无论如何在每个搜索结果项旁边都有一个按钮可以实现这一点?任何帮助将不胜感激。我当前的代码如下。
设计控制器:
class DesignsController < ApplicationController
def index
@search = Api.new.find(params[:q])['results']
end
end
Class方法:
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
app/views/designs/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 %>
app/config/routes.rb:
resources :designs, only: [:index, :create]
app/controllers/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
待办事项:
- 您的
Design
模型需要具有您想要保存的属性(即::name
?和:thumbnail_url
?)。我的假设是您已经拥有 created/migrated 这些属性;如果还没有,请添加它们。 - 因为我上面的代码中仍然存在漏洞,任何用户都可以修改
<button>
的<form action='...'>
(即他们可以根据需要修改设计的 "name"当它被保存时),那么我上面的解决方案仍然不是最好的解决方案,尽管为了简单起见并且假设这个漏洞对你来说不是问题,那么上面的代码已经足够了。