Rails从视图调用外部API的方法?

时间:2017-02-16 23:59:14

标签: ruby-on-rails json api

我试图在我的一个视图中包含某种“小部件”,允许用户使用外部“搜索”API。外部API返回一组JSON结果。我想使用这个JSON向用户显示结果列表。

实现这一目标的'轨道方式'是什么?

例如,我想在主页上添加一个搜索输入,并带有一个搜索外部API的按钮。我创建了一个调用API的PORO,这个PORO将返回结果,但是如何获取用户搜索字符串并将其发布到此PORO?

1 个答案:

答案 0 :(得分:1)

总结我们在评论中讨论过的内容。完成所需内容的最简单方法是需要一个视图来呈现小部件,一个路由+控制器来处理搜索请求。

  

这是所有未经测试的代码,但你可以得到它的要点。

# routes.rb
# this can be named and pointed to anywhere you want.
# It's using get just so you can see the search params in the url, which is preety common for the search feature.
get '/search', to: 'searches#show', as: 'search'

# models/search.rb
# Your PORO
class Search
  attr_reader :results
  def initialize(query)
    # perform request and assign results
    @results = HTTParty.get(url, query: { keyword: query })
  end
end

# controllers/searches_controller.rb
def show
  if params[:query]
    @search = Search.new(params[:query])
  end
end

# views/searches/show.html.erb
<%= form_tag search_path, method: :get do %>
  <%= text_field_tag :query, params[:query] %>
  <%= submit_tag %>
<% end %>

# .... renders contents if they're present.
<%= @search.results if @search %>

您还可以做的是将搜索转换为模型,因此它将继承命名,您可以将其作为常规资源处理。

# routes.rb
# A singular resource will do.
resource :search, only: [:show]

# models/search.rb
include ActiveModel::Model
attr_reader :results
attr_accessor :query
validates :query, presence: true
def perform
  @results = HTTParty.....
end

# controllers/searches_controller.rb
def show
  if search_params = params[:search] && params[:search][:query]
    @search = Search.new(query: search_params)
    @search.perform if @search.valid?
  else
    @search = Search.new
  end
end

# views/searches/show.html.erb
<%= form_for @search, method: :get do |f| %>
  <%= f.text_field :query %>
  <%= f.submit %>
<% end %>

<%= @search.results %>

现在......您可能希望在任何地方呈现窗口小部件,而不仅仅是/ search,因此您可以将表单提取为部分并在application.html.erb中呈现它。

如果您采用ActiveModel方法,请不要忘记在每次呈现表单的请求中初始化@search。您可以使用before_action