我正在开发一个简单的webapp,您可以在其中导入CSV并使用Sunspot搜索它。用户使用的唯一操作是Index和Show。所有这一切都运行良好,但最终目标是能够准确跟踪搜索的内容并将其导出。
我的datasheets
模型是上传CSV的模型。包括搜索在内的这一点工作正常。默认情况下,datasheets
和datalog
都是脚手架和路由。我首先尝试在我的DatasheetsController
中添加一个定义datalog
的新实例使用搜索模型。
datasheets_controller.rb (工作正常)
def index
@search = Datasheet.search do
fulltext params[:search]
end
@datasheets = @search.results
respond_to do |format|
...
end
end
这是我尝试创建新的数据记录。我是Rails的新手并意识到这不是RESTful,但我在这里找到一个快速而肮脏的解决方案。
class DatasheetsController < ApplicationController
after_filter :log_it
def log_it
@datalog = Datalog.new(params[:datalog])
end
end
这对于development.log没有任何帮助,所以我尝试将参数更改为@datalog = Datalog.new(params[:search])
,但它给了我以下错误:
NoMethodError in DatasheetsController#index
undefined method `stringify_keys` for "[whatever is searched for]":string
我确定我离开这里,但我认为这是一件容易接受的事情,但事实并非如此。如果有帮助,一旦这个工作,我想创建的datalog
属性:name
与搜索到的字符串相同。正确的方向上的任何一点(或者做得如此糟糕)都会非常感激。
编辑:我还想补充说,如果有一种简单的方法来记录搜索结果(它不必在模型中),那么任何东西都是受欢迎的(包括宝石)。我在Google和SO上搜索了尽可能多的关键字变体,并且无法找到任何内容。
编辑2:
编辑了一些我已经接近的东西,但我仍然遇到问题。
我已将以下内容添加到def index
:
@logkey = :search
并将log_it
定义更改为:
def log_it
@datalog = Datalog.new(params[:id])
@datalog.update_attribute(:name, @logkey)
end
现在新的数据记录将保存在搜索上,这很好,但:name
属性总是最终成为“搜索”。
我现在拥有的数据记录示例表是:
搜索显示编辑销毁
搜索显示编辑销毁
搜索显示编辑销毁
搜索显示编辑销毁
搜索显示编辑销毁
新数据记录
我尝试将@logkey
行更改为:@logkey = :search.to_s
,但它并没有真正起作用。
编辑回复
SQL(0.5ms)INSERT INTO“datalogs”(“created_at”,“name”,“updated_at”)VALUES(?,?,?,?)[[“created_at”,星期二,2013年2月26日18:26 :04 UTC +00:00],[“name”,nil],[“updated_at”,星期二,2013年2月26日18:26:04 UTC +00:00]]
再次,如果这只是其他地方的问题我得到了,我可以在我自己的时间寻找它。再次感谢!
答案 0 :(得分:1)
问题如下:
ActiveRecord::Base
(在轨道中进行模型的标准方式).new
此类的方法(documented here)采用属性哈希(和选项,但我们现在不关心它).new
尝试使用哈希的每个键值对创建类的实例,其方式是将实例键命名属性设置为值params[:search]
不能用作.new
的参数,因此会抛出异常它应该如何:
:attr_accessor name
params[:search] = { :name => 'My favourite search name' }
另一个注意事项
如果您只是在bundle exec rails s
运行,则可以在服务器日志中看到您的参数。在生产中,只需使用:less log/development.log
。你可以查看你的应用程序发送的是什么。
问题更新后更新
@logkey = params[:search].to_s
评论后更新
好的,@datalog.update_attribute(:name, @logkey)
行没有必要。只需使用您的原始版本:@datalog = Datalog.new(params[:datalog])
它就是“轨道方式”。
请记住我的第一部分答案,因此params[:datalog]
应该是哈希值。但是,如果您无法做到这一点,那么只需使用:
@datalog = Datalog.new(params[:id])
@datalog.name = params[:search] # I dont think to_s is needed
@datalog.save # To save it into the database