首页 > 解决方案 > 从浏览器检索用户输入以在控制器中用于第三方查询字符串 rails

问题描述

我只是想让用户从我的form_tag.

一般的想法是用户在text_field_tag

应用程序/视图/页面/home.html.erb

<div>
   <%= form_tag root_path, method: :get, remote: true do %>
      <%= text_field_tag :search, params[:search] %>
      <%= submit_tag 'Search', name: nil, class: 'submit' %>
   <% end %>
</div>

我有一些 JavaScript 来获取参数并将它们附加到浏览器中的当前 url。

/main/app/assets/javascript/table.js

function appendParamToUrl() {
   var pages = '';
   var term = $('#search').val();
   window.history.pushState( pages, 'url', '?search=' + term );
}

然后我尝试从 rails 控制器中检索这些参数以添加到查询字符串中,以便对第三方进行 api 调用。

def home
        term = params[:search]
        @stats = HTTParty.get("https://api.ritekit.com/v1/stats/history/#{term}?tags=&client_id=81c7fa4e99adc98e9455c86ee38a4c1bbe3f97328732")
        gon.queries = @stats
end

Rails 控制台显示正确的参数

Started GET "/?utf8=%E2%9C%93&search=trump" for 148.75.220.61 at 2018-08-21 00:28:49 +0000
Cannot render console from 148.75.220.61! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by PagesController#home as JS
  Parameters: {"utf8"=>"✓", "search"=>"trump"}
  User Load (0.6ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]
  Rendering pages/home.html.erb within layouts/application
  Rendered pages/home.html.erb within layouts/application (1.2ms)
  Rendered shared/_nav.html.erb (0.8ms)
Completed 200 OK in 1182ms (Views: 71.4ms | ActiveRecord: 0.6ms)

但是,除非我重新加载页面,否则当term = params[:search]出现时nil,参数会留在浏览器中,然后会发生预期的结果。检索到的数据用于填充我设置的数据表。

任何帮助将不胜感激。

标签: javascriptruby-on-railsrubyapiruby-on-rails-5

解决方案


问题是你试图term = params[:search]在你的控制器中检索这将从form_tag部件中获取价值,因为这是一个远程表单,你需要设置如下:

respond_to do |format|
  format.js {}
end

您现在可以将所需数据附加到此home.js.erb文件中的表中。您不需要编写像appendParamToUrl.

请参阅2 不显眼的 JavaScript

---UPDATE--- <%= text_field_tag :search, params[:search] %>这行会在页面加载时获取url中的值,所以第一次params[:search]为nil。而当你点击提交按钮时,服务器会感到困惑,因为你有两个参数[:search],一个在 url 中,另一个在 text_field_tag 中。
您需要确定首先需要获得哪个。
如何将搜索更改为在 url 中查询,然后您可以在控制器中检查 param[:query] 和 param[:search],我确信其中一个具有非 nil 值。


推荐阅读