【问题标题】:Rails form submit for two different modelsRails 表单提交两种不同的模型
【发布时间】:2013-02-27 02:36:25
【问题描述】:

我正在开发一个简单的 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", 2013 年 2 月 26 日星期二 18:26 :04 UTC +00:00], ["name", nil], ["updated_at", 2013 年 2 月 26 日星期二 18:26:04 UTC +00:00]]

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

【问题讨论】:

  • @logkey = params[:search].to_s 但是请参阅下面的答案。

标签: ruby-on-rails ruby forms sunspot


【解决方案1】:

问题如下:

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

它应该是什么样子:

  • 在 Datalog 模型中,您应该有类似::attr_accessor name
  • 参数应该params[:search] = { :name =&gt; '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

【讨论】:

  • +1 非常感谢您的精彩解释,现在更有意义了。不幸的是,在实现:name 之后为零。我没有在控制台或 development.log 中抛出任何错误。我绝对知道这不是您的建议,但很可能是已经存在的问题。如果有帮助,我会将 SQL INSERT INTO 行编辑到我的问题中。
  • 哇,最后一次编辑让我点击了。我让这种方式变得比它需要的更困难。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
相关资源
最近更新 更多