コメントで説明した内容を要約するだけです。必要なものを達成する最も簡単な方法は、ウィジェットをレンダリングするビューと、ルート+コントローラが検索要求を処理する必要があります。
これはすべてのテストされていないコードですが、その要点を得ることができます。あなたは、さらにモデルに検索を有効にされない可能性があり、それが命名継承すると、あなたが定期的にリソースとして扱うことができるもの
# 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 %>
は今...あなたは、おそらくに/検索いたるところだけでなく、あなたのウィジェットをレンダリングしたいので、あなたは、部分的にフォームを抽出し、application.html.erbでそれをレンダリングすることができます。
あなたがActiveModelのアプローチを行った場合は、フォームをレンダリングするたびに@searchを初期化することを忘れないでください。そのためにbefore_action
を使用することができます。
どのようにユーザーがウィジェットと対話しますか?ユーザーが検索パラメータを送信した後で、ページ全体をリロードする予定はありますか?私の考えでは、ウィジェットはJSだけでやっていることのようなもので、APIを直接照会してルビを通らずに結果をレンダリングします。しかし、Rubyで応答を解析する前に解析する必要がある場合は、通常のリクエストまたはajaxを使用して検索パラメータをコントローラに送信する必要があります。 –
おそらく、ウィジェットは間違った用語でした。検索パラメータを送信した後にページをリロードする必要があります。私はベストプラクティスがこれをすることであるかどうか分かりません。 form_forを使用すると、この場合に動作しない特定のモデルのフォームが示唆されます。 – stoerebink
モデルにバインドされていない 'form_tag'を試すことができます。 http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html –