【问题标题】:In Rails, how can I create a button that saves an entry from an external api into my database?在 Rails 中,如何创建一个按钮,将外部 api 的条目保存到我的数据库中?
【发布时间】:2019-06-18 13:10:23
【问题描述】:

我有一个 Rails api,它使用 HTTParty gem 使用外部设计搜索 api。使用返回到我的视图的数据,我希望能够将选定的条目保存到我的数据库中。有点像书签功能。无论如何,在每个搜索结果项旁边都有一个按钮可以实现这一点吗?任何帮助将不胜感激。我当前的代码如下。

设计控制器:

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

【问题讨论】:

  • Design 模型你用什么?因为这是放置/存储“结果”(对于他们单击的每个项目)的理想场所。如果这已经是您的意图,但您不知道如何处理,请参阅下面的答案。
  • @Jay-Ar 是的,这就是设计模型的目的。

标签: ruby-on-rails json ruby api httparty


【解决方案1】:

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?)。我的假设是您已经创建/迁移了这些属性;如果还没有,请添加它们。
  • 因为我上面的代码中仍然存在一个漏洞,即任何用户都可以修改&lt;button&gt;&lt;form action='...'&gt;(即他们可以在保存设计时随意修改设计的“名称”),然后我的上面的解决方案仍然不是最好的解决方案,虽然为了简单起见,假设这个漏洞对你来说不是问题,那么上面的代码已经足够了。

【讨论】:

  • 非常感谢您的回答 :) 是的,我实际上希望在没有 AJAX 的情况下这样做:/ 我不知道它是否正在保存。当我将 @designs = Design.all 添加到我的索引操作中,然后转到 localhost3000:/designs 或尝试在视图中使用 @designs 变量时,没有保存的设计
  • @catinahat 没有问题。我将更新我的代码以不使用 AJAX :)
  • @catinahat 我刚刚更新了我的代码。单击上方的“已编辑...以前”以查看已更改的内容。让我知道它是否有效。
  • 我仍然无法查看保存的设计...我的模型中应该有attr_accessor :name, :thumbnail_url 吗?
  • @catinahat 你遇到错误了吗?如果单击按钮会发生什么?您不需要attr_accessor,因为:name:thumbnail_url 已经是Design 模型的属性(我的假设如上所述)
猜你喜欢
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 2019-12-13
  • 1970-01-01
  • 2016-02-16
相关资源
最近更新 更多