使用 rails 将搜索结果发送到 json

Posted

技术标签:

【中文标题】使用 rails 将搜索结果发送到 json【英文标题】:Send search results to json with rails 【发布时间】:2016-09-19 17:38:22 【问题描述】:

我目前正在开发一个 Rails 应用程序的简单搜索功能。我正在使用 Vue.js,所以我使用 Rails 的 JSON 构建器将所有内容提供给前端。对于搜索,我的控制器和模型设置如下:

控制器:

def index
  if params[:search]
    @strains = Strain.search(params[:search]).order("created_at DESC")
  else
    @strains = Strain.all.order("created_at DESC")
  end
  respond_to do |format|
    format.html
    format.json  render :json => @strains 
  end
end

型号:

  def self.search(search)
    where('title LIKE ?', '%#search%')
  end

观点:

<%= form_tag(strains_path, :method => "get") do %>
  <%= text_field_tag :search, params[:search], placeholder: "Search Strains" %>
  <%= submit_tag "Search", :name => nil %>
<% end %>

当我输入搜索时,我看到它更新了 URL 中的参数,但页面上的输出没有任何变化。我认为它与JSON有关。这是我在 Vue 组件中的现成函数。

ready: function() 
    var that;
    that = this;
    $.ajax(
      url: '/strains.json',
      success: function(res)
        that.strains = res;
      
    );
  

我正在查看日志,它似乎会呈现对 HTML 的搜索,而不是对 JSON 的搜索。

这是日志:

Started GET "/strains.json" for ::1 at 2016-05-23 21:40:32 -0400
Processing by StrainsController#index as JSON
  Strain Load (0.2ms)  SELECT "strains".* FROM "strains"  ORDER BY created_at DESC
Completed 200 OK in 2ms (Views: 1.8ms | ActiveRecord: 0.2ms)


Started GET "/strains?utf8=%E2%9C%93&search=Test" for ::1 at 2016-05-23 21:41:07 -0400
Processing by StrainsController#index as HTML
  Parameters: "utf8"=>"✓", "search"=>"Test"
  Strain Load (0.2ms)  SELECT "strains".* FROM "strains" WHERE (title LIKE '%Test%')  ORDER BY created_at DESC
  Rendered strains/index.html.erb within layouts/application (1.5ms)
Completed 200 OK in 17ms (Views: 16.3ms | ActiveRecord: 0.2ms)


Started GET "/strains.json" for ::1 at 2016-05-23 21:41:07 -0400
Processing by StrainsController#index as JSON
  Strain Load (0.1ms)  SELECT "strains".* FROM "strains"  ORDER BY created_at DESC
Completed 200 OK in 2ms (Views: 1.4ms | ActiveRecord: 0.1ms)

【问题讨论】:

【参考方案1】:

我不确定这是否是您的主要问题,但看起来您的 where 子句使用单引号,因此没有选择该变量。如果要使用 ruby​​ 字符串插值,则需要使用双引号。

irb(main):006:0> foo = 5
=> 5
irb(main):007:0> 'this is my number #foo'
=> "this is my number \#foo"
irb(main):008:0> "this is my number #foo"
=> "this is my number 5"

所以你想要:

  def self.search(search)
    where('title LIKE ?', "%#search%")
  end

【讨论】:

刚刚修复。但我认为问题在于在控制器中渲染 json。【参考方案2】:

您应该设置 dataType 选项以期望 JSON 数据作为返回值。你可以这样做:

$.ajax(
  url: '/strains.json',
  dataType: 'json',
  success: function(res)
    that.strains = res;
  
);

【讨论】:

我是否将 format.json render formats: [:json] 放在 if 语句中? @Dileet 我从我的答案中删除了format.json。再次阅读您的问题后,您所拥有的一切都很好。我相信在 Ajax 调用中添加 dataType 就足够了。 它仍然不会用搜索结果更新表格。这是网址localhost:3000/strains?utf8=%E2%9C%93&search=Test 您可以将 Rails 日志添加到问题中吗?我想查看此操作的 StartedCompleted 行之间的所有内容。 已编辑。如果我删除 respond_to 块并在搜索 if 块中添加“render :json => @strains”,它会发送正确的 json。我认为问题是我需要一种在有搜索参数时将更新推送到 json 文件的方法。

以上是关于使用 rails 将搜索结果发送到 json的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Axios 将 JSON 数据正确发送到 rails 服务器,以正确匹配所需的 rails 参数哈希?

如何将 json 从 iOS 设备发送到 Rails 服务器

将 JSON 对象从 rails 控制器发送到 Javascript

将对象序列化为 JSON,然后使用 NEST 在弹性搜索中发送查询

Ruby on Rails,如何确定请求是由机器人还是搜索引擎蜘蛛制作的?

将 PHP json_encode 数组发送到 jQuery