Rails表单提交两个不同的模型

时间:2013-02-26 17:21:10

标签: ruby-on-rails ruby forms sunspot

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

我的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

现在新的数据记录将保存在搜索上,这很好,但: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]]

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

1 个答案:

答案 0 :(得分:1)

问题如下:

  • 我假设您的Datalog模型源自ActiveRecord::Base(在轨道中进行模型的标准方式)
  • .new此类的方法(documented here)采用属性哈希(和选项,但我们现在不关心它)

    • 从此哈希.new尝试使用哈希的每个键值对创建类的实例,其方式是将实例键命名属性设置为值
  • 问题是您的示例中的params[:search]不能用作.new的参数,因此会抛出异常

它应该如何:

    在数据记录模型中
  • ,你应该有::attr_accessor name
  • params应该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