0

我正在开发一个简单的 web 应用程序,您可以在其中导入 CSV 并使用 Sunspot 搜索它。用户使用的唯一操作是索引和显示。所有这些都运行良好,但最终目标是能够准确跟踪正在搜索的内容并将其导出。

我的datasheets模型是用于上传 CSV 的模型。同样,包括搜索在内的工作正常。两者datasheetsdatalog默认情况下都是脚手架和路由的。第一次尝试时我想我只需在我的定义中添加一个定义,该定义将使用搜索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

现在一个新的 Datalog 将节省搜索,这很棒,但:name属性总是以“搜索”结尾。

我现在有一个用于数据记录的示例表是:


姓名

搜索显示编辑销毁

搜索显示编辑销毁

搜索显示编辑销毁

搜索显示编辑销毁

搜索显示编辑销毁

新数据记录


我尝试将@logkey行更改为:@logkey = :search.to_s但它并没有真正影响任何事情。

编辑以回应答案

SQL (0.5ms) INSERT INTO "datalogs" ("created_at", "name", "updated_at") VALUES (?, ?, ?, ?) [["created_at", Tue, 26 Feb 2013 18:26:04 UTC +00:00], ["name", nil], ["updated_at", 2013 年 2 月 26 日星期二 18:26:04 UTC +00:00]]

同样,如果这只是其他地方的问题,我会得到它,我可以在自己的时间寻找它。再次感谢!

4

1 回答 1

1

问题如下:

  • 我假设您的 Datalog 模型源自ActiveRecord::Base(在 Rails 中做模型的标准方法)
  • .new此类的方法(在此处记录)采用属性哈希(和选项,但我们现在不关心)
    • 从此散列.new尝试使用散列的每个键值对创建类的实例,以将实例键命名属性设置为值
  • 问题是params[:search]在您的示例中不能用作参数.new,因此它会引发异常

它应该是什么样子:

  • 在 Datalog 模型中,您应该具有以下内容::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])它是“rails 方式”。

请记住我的第一部分答案,所以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
于 2013-02-26T18:04:58.433 回答