我试图在我的一个视图中包含某种“小部件”,允许用户使用外部“搜索”API。外部API返回一组JSON结果。我想使用这个JSON向用户显示结果列表。
实现这一目标的'轨道方式'是什么?
例如,我想在主页上添加一个搜索输入,并带有一个搜索外部API的按钮。我创建了一个调用API的PORO,这个PORO将返回结果,但是如何获取用户搜索字符串并将其发布到此PORO?
答案 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
。