2017-02-16 2 views
0

Я пытаюсь включить какой-то «виджет» в одном из моих представлений, что позволяет пользователю потреблять внешний API поиска. Внешний API возвращает набор результатов JSON. Я хотел бы использовать этот JSON, чтобы показать пользователю список результатов.Rails способ вызова внешнего API из представления?

Что такое «путь рельсов», чтобы это произошло?

Например, я хотел бы разместить поиск на домашней странице с помощью кнопки для поиска внешнего API. Я создал PORO, который вызывает API, и этот 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

Все, кажется, работает, кроме как копать. undefined method 'dig 'для {" controller "=>" last_fms "," action "=>" show "}: ActionController :: Параметры – stoerebink

+1

try' params [: search] && params [: search] [: query] ' , –

+1

Работает как шарм. Спасибо, добрый сэр! – stoerebink

Смежные вопросы