2017-02-16 26 views
0

私は、ユーザーが外部の「検索」APIを使用することを可能にする、ある種の「ウィジェット」を私のビューの1つに取り込もうとしています。外部APIは結果のJSONセットを返します。このJSONを使用してユーザーに結果のリストを表示したいと思います。Railsはビューから外部APIを呼び出しますか?

これを実現するための「レール方法」とは何ですか?

たとえば、外部APIを検索するボタンを使用して、ホームページに検索入力を入れたいとします。 APIを呼び出すPOROを作成しましたが、このPOROは結果を返しますが、ユーザーの検索文字列をこのPOROに投稿するにはどうすればよいですか?

+1

どのようにユーザーがウィジェットと対話しますか?ユーザーが検索パラメータを送信した後で、ページ全体をリロードする予定はありますか?私の考えでは、ウィジェットはJSだけでやっていることのようなもので、APIを直接照会してルビを通らずに結果をレンダリングします。しかし、Rubyで応答を解析する前に解析する必要がある場合は、通常のリクエストまたはajaxを使用して検索パラメータをコントローラに送信する必要があります。 –

+0

おそらく、ウィジェットは間違った用語でした。検索パラメータを送信した後にページをリロードする必要があります。私はベストプラクティスがこれをすることであるかどうか分かりません。 form_forを使用すると、この場合に動作しない特定のモデルのフォームが示唆されます。 – stoerebink

+1

モデルにバインドされていない 'form_tag'を試すことができます。 http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html –

答えて

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 %> 

は今...あなたは、おそらくに/検索いたるところだけでなく、あなたのウィジェットをレンダリングしたいので、あなたは、部分的にフォームを抽出し、application.html.erbでそれをレンダリングすることができます。

あなたがActiveModelのアプローチを行った場合は、フォームをレンダリングするたびに@searchを初期化することを忘れないでください。そのためにbefore_actionを使用することができます。

+0

digを除くすべてが動作するようです。 アクションコントローラ::パラメータ – stoerebink

+1

'params [:search] && params [:search] [:query]'を試してみると、未定義メソッド 'dig '{controller" => "last_fms"、 "action" = " 。 –

+1

魅力的な作品です。あなたの親切な先生に感謝! – stoerebink

関連する問題