Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 搜索栏Ruby On Rails的问题_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 搜索栏Ruby On Rails的问题

Ruby on rails 搜索栏Ruby On Rails的问题,ruby-on-rails,ruby,Ruby On Rails,Ruby,我试图实现一个搜索栏,当我测试时,它以一种奇怪的方式工作:只能找到最后几个字母,或者整个名字。 很抱歉,如果这个问题很容易解决,我是RubyonRails新手,我真的需要修复这个问题,我自己也找不到如何修复它。 对不起,我的英语不好 这是我的html: <div class="search"> <%= form_for root_path, :url => {:action => "search"}, class: 'navbar-form' do |f| %&

我试图实现一个搜索栏,当我测试时,它以一种奇怪的方式工作:只能找到最后几个字母,或者整个名字。 很抱歉,如果这个问题很容易解决,我是RubyonRails新手,我真的需要修复这个问题,我自己也找不到如何修复它。 对不起,我的英语不好

这是我的html:

<div class="search">
  <%= form_for root_path, :url => {:action => "search"}, class: 'navbar-form' do |f| %>
  <%= text_field_tag 'ad[price_min]', @ads_min, :placeholder => "Price min", class: "form-control embed-responsive-item" %>
  <%= text_field_tag 'ad[price_max]', @ads_max, :placeholder => "Price max", class: "form-control embed-responsive-item" %>
  <%= text_field_tag 'ad[title]', @ads_text, :placeholder => "Search xablau by name", class: "form-control embed-responsive-item" %>
  <button class="btn btn-info" ><i class="glyphicon glyphicon-search"></i></button>
  <% end %>
</div>
这是我的模型:

def self.search(query)
  price_min = query[:price_min].present? ? "price >= #{query[:price_min].to_f}" : nil
  price_max = query[:price_max].present? ? "price <= #{query[:price_max].to_f}" : nil
  title = query[:title].present? ? "title LIKE '%#{query[:title]}'" : nil

  query = [title, price_min, price_max].compact.join(" AND ")

  return Ad.where( query )
end
您必须使用ILIKE和%text%,而不是%text

因为%text%与任何包含文本的字符串匹配,而%text只与字符串末尾包含文本的字符串匹配


PS:您必须重写搜索方法,因为将基于用户的文本放在sql中是不安全的。不要像“{query[:title]}”这样写标题,写一些像wheretitle-ILIKE?,%%{params[:q]}%

如果您使用占位符,这样他就不会受到SQL注入攻击,我会给+一个。我刚刚尝试了这个方法,得到了以下错误消息:ActiveRecord::StatementInvalid in Indexsearch SQLite3::SQLException:near-ILIKE:语法错误:从标题ILIKE“%a%”的广告中选择广告。*@Zebiro使用,就像我认为您在使用psql一样。SQLite没有ILIKE函数。
def self.search(query)
  price_min = query[:price_min].present? ? "price >= #{query[:price_min].to_f}" : nil
  price_max = query[:price_max].present? ? "price <= #{query[:price_max].to_f}" : nil
  title = query[:title].present? ? "title LIKE '%#{query[:title]}'" : nil

  query = [title, price_min, price_max].compact.join(" AND ")

  return Ad.where( query )
end
title = query[:title].present? ? "title ILIKE '%#{query[:title]}%'" : nil