我尝试使用以下代码在我的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
答案 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中,这是最好的做法,因为您在表单调用中指定了类对象,并让自己知道它对该对象的作用。