PostgreSQL全文搜索不会从Rails中的表单中获取参数

时间:2017-03-23 11:46:29

标签: ruby-on-rails postgresql full-text-search

我尝试使用以下代码在我的rails应用中复制railscast#343:

class Article < ActiveRecord::Base
  def self.text_search(query)
    if query.present?
      where("description @@ :q", q: query)    
    else
      where(nil)
    end
  end

class ArticlesController < ApplicationController
  def index
    @articles = Article.text_search(params[:query])
  end

并且此视图形式:

<%= simple_form_for articles_path, method: :get do |f| %>
  <%= f.input :query, autofocus: true, label: false %>
  <%= f.submit 'Search', name: nil %>
<% end %>

在控制台中,text_search方法有效。从日志: Parameters: {"utf8"=>"✓", "/en/articles"=>{"query"=>"word"}, "locale"=>"en"} 我看到params已发送,但我仍然列出了所有文章并且未执行任何搜索:Article Load (0.5ms) SELECT "articles".* FROM "articles"

我有rails 4.2.2,PostgreSQL 9.3.7,ruby 2.2.5

1 个答案:

答案 0 :(得分:0)

您需要将搜索参数传递为:

Article.text_search(params[:search]["query"]) 

将@article添加到simpleform_for行:

<%= simple_form_for @article, articles_path, method: :get do |f| %>

并将@article = Article.new添加到控制器中的新操作中。

您的属性将嵌套在内部:文章!您可以在控制台输出中看到,文章表单发送的参数将始终包含在表单所用的类名称(文章)中,通过Rails Form帮助程序。

<强>更新

由于simple_form_for没有明确传递@article,因此它将包含在提交操作的名称中,在这种情况下是提交操作。离开你:params[:search]["query"]

更多Rails方法是包含@article,从而包装您的参数哈希,如上所述(params[:article][:query]):

<%= simple_form_for @article, {url here}, {options like 'method: :get' or 'remote: true' here } do |f| %>

了解更多信息。因为每个人都喜欢额外的信息,Rails提供了一种方法来为form_for调用指定params散列的包装名称,因此你也可以这样做:

<%= simple_form_for (@article, as: :search), articles_path, method: :get do |f| %>

如果您真的希望将params保存在“搜索”IMO中,这是最好的做法,因为您在表单调用中指定了类对象,并让自己知道它对该对象的作用。