我正在尝试在我的RoR网站上运行一个简单的搜索表单。我有以下代码:
(在note_controller.rb中)
def search
@results = Note.find_with_ferret(params[:term]).sort_by(&:ferret_rank)
respond_to do |format|
format.html
format.xml { render :xml => @nootes }
end
end
(在note.rb中)
class Note < ActiveRecord::Base
acts_as_ferret :fields => [ :title, :body ]
end
(在index.html.erb中)
<%= form_tag :action => 'search'%>
<%= text_field 'term', nil %>
<%= submit_tag 'Search' %>
</form>
(在search.html.erb中)
<h1><%= pluralize(@results.size, 'result') %></h1>
<ul>
<% for result in @results %>
<li><%= result.ferret_score %>: <%= link_to result.tile, result %></li>
<% end %>
</ul>
正如你可以从上面看到的那样,我有一个模型,我告诉过act_as_ferret。然后我在我的控制器中进行了搜索操作,该操作尝试渲染到search.html.erb视图。我在索引视图中有一个表单可以进行搜索。但是,当我运行它时,我收到以下错误:
无法将Array添加到BooleanQuery
我想我的表单有问题,所以雪貂以某种方式获取了错误的数据。 form_tag是我做的正确方法吗?任何帮助将不胜感激。
更新
以下是我可以从日志中提取的唯一一点。我正在使用Heroku,它似乎没有提供相当标准的日志文件。希望这有用。
Processing NotesController#search (for 152.78.202.74, 127.0.0.1 at 2008-10-25 07:32:23)
[POST] Session ID: BAh7BzoMY3NyZl9pZCIlZmEyMzcxZTdlYTUyODRkNzlmMzdjZWJlOGNlOGYz M2UiCmZsYXNoSUM6J0FjdGlvbkNvbnRyb2xsZXI6OkZsYXNoOjpGbGFzaEhh c2h7AAY6CkB1c2VkewA=--450f51b45e38cba302e8ac6bd9b03c7ae79981e9
Parameters: {"commit"=>"Search", "term"=>["wheelbarrow"], "authenticity_token"=>"1879a835ded87e7a28861725ec668b690de6b7f5", "action"=>"search", "controller"=>"notes"}
configured index for class Note: {
:index_dir=>"/mnt/home/userapps/38385/index/development/note",
:mysql_fast_batches=>true, :name=>:note, :single_index=>false,
:index_base_dir=>"/mnt/home/userapps/38385/index/development/note",
:reindex_batch_size=>1000,
:registered_models=>[Note(id: integer, title: string, body: text, created_at: datetime, updated_at: datetime)],
:ferret=>{:dir=>#,
:key=>[:id, :class_name],
:or_default=>false,
:handle_parse_errors=>true,
:auto_flush=>true,
:create_if_missing=>true,
:path=>"/mnt/home/userapps/38385/index/development/note",
:default_field=>[:title, :body],
:analyzer=>#,
:lock_retry_time=>2},
:ferret_fields=>{:title=>{:via=>:title, :term_vector=>:with_positions_offsets, :boost=>1.0, :store=>:no, :highlight=>:yes, :index=>:yes},
:body=>{:via=>:body, :term_vector=>:with_positions_offsets, :boost=>1.0, :store=>:no, :highlight=>:yes, :index=>:yes}},
:fields=>[:title, :body],
:raise_drb_errors=>false,
:user_default_field=>nil,
:enabled=>true}
ArgumentError (Cannot add Array to a BooleanQuery): /vendor/plugins/acts_as_ferret/lib/ferret_find_methods.rb:124:in `add_query'
/vendor/plugins/acts_as_ferret/lib/ferret_find_methods.rb:124:in `scope_query_to_models'
/vendor/plugins/acts_as_ferret/lib/ferret_find_methods.rb:102:in `find_ids'
/vendor/plugins/acts_as_ferret/lib/ferret_find_methods.rb:85:in `find_id_model_arrays'
/vendor/plugins/acts_as_ferret/lib/ferret_find_methods.rb:41:in `ar_find'
/vendor/plugins/acts_as_ferret/lib/ferret_find_methods.rb:12:in `find_records'
/vendor/plugins/acts_as_ferret/lib/acts_as_ferret.rb:342:in `find'
/vendor/plugins/acts_as_ferret/lib/class_methods.rb:155:in `find_with_ferret'
/app/controllers/notes_controller.rb:14:in `search'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/base.rb:1162:in `send'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/base.rb:1162:in `perform_action_without_filters'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/filters.rb:580:in `call_filters'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/filters.rb:573:in `perform_action_without_benchmark'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue_without_timeout'
/usr/lib/ruby/1.8/benchmark.rb:293:in `measure'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue_without_timeout'
/home/userapps_plugins/preload/request_timeout/lib/request_timeout.rb:9:in `perform_action_without_rescue'
/usr/lib/ruby/1.8/timeout.rb:48:in `timeout'
/home/userapps_plugins/preload/request_timeout/lib/request_timeout.rb:8:in `perform_action_without_rescue'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/rescue.rb:201:in `perform_action_without_caching'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/caching/sql_cache.rb:13:in `perform_action'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/connection_adapters/abstract/query_cache.rb:33:in `cache'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/query_cache.rb:8:in `cache'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/caching/sql_cache.rb:12:in `perform_action'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/base.rb:529:in `send'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/base.rb:529:in `process_without_filters'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/filters.rb:569:in `process_without_session_management_support'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/session_management.rb:130:in `process'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/base.rb:389:in `process'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/dispatcher.rb:149:in `handle_request'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/dispatcher.rb:107:in `dispatch'
/usr/lib/ruby/1.8/thread.rb:135:in `synchronize'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/dispatcher.rb:104:in `dispatch'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/dispatcher.rb:120:in `dispatch_cgi'
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/dispatcher.rb:35:in `dispatch'
/usr/lib/ruby/gems/1.8/gems/thin-0.8.2/lib/rack/adapter/rails.rb:54:in `serve_rails'
/usr/lib/ruby/gems/1.8/gems/thin-0.8.2/lib/rack/adapter/rails.rb:74:in `call'
/home/heroku_rack/lib/toolbar.rb:16:in `call'
/usr/lib/ruby/gems/1.8/gems/rack-0.4.0/lib/rack/urlmap.rb:42:in `call'
/usr/lib/ruby/gems/1.8/gems/rack-0.4.0/lib/rack/urlmap.rb:35:in `each'
/usr/lib/ruby/gems/1.8/gems/rack-0.4.0/lib/rack/urlmap.rb:35:in `call'
/usr/lib/ruby/gems/1.8/gems/rack-0.4.0/lib/rack/builder.rb:53:in `call'
/usr/lib/ruby/gems/1.8/gems/thin-0.8.2/lib/thin/connection.rb:59:in `pre_process'
/usr/lib/ruby/gems/1.8/gems/thin-0.8.2/lib/thin/connection.rb:50:in `process'
/usr/lib/ruby/gems/1.8/gems/thin-0.8.2/lib/thin/connection.rb:35:in `receive_data'
/usr/lib/ruby/gems/1.8/gems/eventmachine-0.12.0/lib/eventmachine.rb:224:in `run_machine'
/usr/lib/ruby/gems/1.8/gems/eventmachine-0.12.0/lib/eventmachine.rb:224:in `run'
/usr/lib/ruby/gems/1.8/gems/thin-0.8.2/lib/thin/backends/base.rb:45:in `start'
/usr/lib/ruby/gems/1.8/gems/thin-0.8.2/lib/thin/server.rb:146:in `start'
/usr/lib/ruby/gems/1.8/gems/thin-0.8.2/lib/thin/controllers/controller.rb:79:in `start'
/usr/lib/ruby/gems/1.8/gems/thin-0.8.2/lib/thin/runner.rb:166:in `send'
/usr/lib/ruby/gems/1.8/gems/thin-0.8.2/lib/thin/runner.rb:166:in `run_command'
/usr/lib/ruby/gems/1.8/gems/thin-0.8.2/lib/thin/runner.rb:136:in `run!'
/usr/lib/ruby/gems/1.8/gems/thin-0.8.2/bin/thin:6 /usr/bin/thin:19:in `load'
/usr/bin/thin:19 Rendering /usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/templates/res
答案 0 :(得分:1)
我记不起曾经看到过雪貂的错误。有两种基本诊断方法:进入脚本/控制台,然后执行
Notes.find_with_ferret("some term that should be in index")
然后看看当你删除索引的目录(/ appname / index / development)时会发生什么,再做一个find_with_ferret强制重新索引?
背景信息:表中的“标题”和“正文”列,或者在实例方法中计算,或者来自例如有很多?如果表中的字段是什么列类型是迁移中声明的“title”和“body”,那么mySQL列类型是什么类型?
通常也很有帮助,包括你的O / S,红宝石,铁轨,雪貂和你正在使用的a_a_f版本。
答案 1 :(得分:0)
我删除了索引目录,它似乎已重新生成,但现在我在控制台上的搜索没有给出任何结果。在删除索引目录之前,我在控制台上获得了结果,但是在我的应用程序中使用表单时没有。
Title和Body都是我MySQL表中的列。它们是使用Rails迁移分别创建的类型字符串和文本。
我在Heroku上运行 - 所以我不完全确定操作系统(可能是linux)或版本,但我知道它至少是rails 2.1。我似乎也找不到AAF的版本号 - 但我想这是相对较新的。
对不起,我无法提供更多帮助 - 我说过有用吗?
罗宾