【问题标题】:Rails not passing the DB Query on search formRails 未在搜索表单上传递数据库查询
【发布时间】:2017-01-06 21:25:03
【问题描述】:

这里看起来更好,这是日志,它传递了参数,但它没有传递带有该参数的查询

Started GET "/items?utf8=%E2%9C%93&search=blanca" for 65.34.251.106 at 2016-08-30 03:55:51 +0000
Processing by ItemsController#index as HTML
Parameters: {"utf8"=>"✓", "search"=>"blanca"}
User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1  [["id", 3]]
Item Load (0.3ms)  SELECT  "items".* FROM "items" LIMIT 50 OFFSET 0
Item Load (0.2ms)  SELECT  "items".* FROM "items"  ORDER BY "items"."id" ASC LIMIT 1 OFFSET 0
Rendered items/_items.html.erb (3.2ms)
Rendered items/index.html.erb within layouts/application (4.9ms)

这是控制器:

def index
 @items = Item.search(params[:search])
end

这是模型:

 class Item < ActiveRecord::Base
  has_many :stocks
  attr_accessible :nombre, :espesor, :material, :quantity
  accepts_nested_attributes_for :stocks
   attr_accessible :stocks_attributes
   self.per_page = 50
   #  def self.search(search)
   #     Item.where("nombre LIKE ?", "%#{search}%")

   #  end

    def self.search(search_term)
    where("nombre LIKE ?", "%#{search_term}%")
    end

    protected
    end

以及视图中的搜索表单:

<%= form_tag items_path, :method => 'get', :id => "items_search" do %>
 <p>
  <%= text_field_tag :search, params[:search], class: "form-control" %>
  <%= submit_tag "Search", :name => nil, class: "btn btn-danger" %>
 </p>

<div id="items"><%= render 'items' %>
</div>
<% end %> 

我有一个 _items.html.erb 文件,其中包含要渲染的项目,该部分有效,因为无论我在搜索栏上输入什么,它总是显示所有项目

这是我尝试在控制台中使用 .search 方法时的输出

 2.3.0 :041 > Item.search("blanca")
 NoMethodError: undefined method `search' for #<Class:0x0000000203fc58>
    from /usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-     4.2.6/lib/active_record/dynamic_matchers.rb:26:in `method_missing'
      from (irb):41
    from /usr/local/rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/commands/console.rb:110:in `start'
    from /usr/local/rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/commands/console.rb:9:in `start'
    from /usr/local/rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/commands/commands_tasks.rb:68:in `console'
    from /usr/local/rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
    from /usr/local/rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/commands.rb:17:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

【问题讨论】:

  • 你在 Rails 控制台中尝试过.search 吗?日志似乎并没有实际执行where
  • 为了完整起见,请添加部分内容。
  • 部分工作正常,否则我无法获得完整的项目列表,问题在于查询未通过
  • 我尝试在控制台中使用搜索时添加了输出
  • @frenciaj,我已经添加了我的答案。如果它解决了您的问题,请告诉我。

标签: mysql ruby-on-rails search


【解决方案1】:

你确定你在item.rb中定义了类方法search吗?因为错误表明Item 类上没有定义search 方法。但是,请尝试以下方法是否适合您。

您只想搜索是否正在提交表单。您可以使用present? 方法来知道搜索词是否真的通过了。

修改你的控制器为

def index
  @items = params[:search].present? ? Item.search(params[:search]) : Item.all
end

请注意,一个对象只有在它不是空白的情况下才是present。这很方便,因为如果有人在表单中输入“”,您不应该在 nombre 字段中搜索空格,而是在 items 表中显示所有记录。

如果表单没有提交,Item.all会被执行。

修改你的类方法

def self.search(search_term)
  where("nombre LIKE ?", "%#{search_term}%")
end

您不需要Item.where,因为Item 类是调用where 方法的当前上下文。请注意,我已将模式更改为 %#{search_term}%,因为您并不总是希望匹配以某种模式结尾的字符串。

希望这会有所帮助!

【讨论】:

  • 我根据你的回答修改了这个,但仍然没有得到查询,日志显示和我之前的一样
  • @frenciaj,这真的很奇怪。你能在 Rails 控制台中执行Item.search(term) 吗?你在index 行动中有什么?看起来您正在访问用户的项目并将它们限制为 50 条记录。请在index 操作中发布您的最新代码。
  • 项目控制器 def index @items = params[:search].present? ? Item.search(params[:search]) : Item.all 结束用户部分是因为安装了设计以进行身份​​验证
  • @frenciaj,如果您查看日志,您可以看到 limitsort 已在记录中完成。你能做到Item.search(term)吗?在控制台中?
  • 不,我无法收到以下错误:NoMethodError: undefined method `search' for #<0x0000000203fc58>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多