Rails 3 从单个模型和方法创建多个记录条目

Posted

技术标签:

【中文标题】Rails 3 从单个模型和方法创建多个记录条目【英文标题】:Rails 3 create multiple record entries from single model & method 【发布时间】:2012-04-11 01:40:58 【问题描述】:

我已经做了一天多了,希望有人可以帮助我。我是 ruby​​/rails 的新手,我想我已经接近了。

我有一个视图,而您可以输入有关公寓的基本信息,例如单元号、价格(如果已启用)。然后,您可以输入要创建的公寓数量。此信息被放入会话变量中,并显示预览表单。例如,如果您输入 5 作为您想要创建的公寓数量,您将在一个表格中获得 5 行,每行都有一个标题为 Unit Number、Rate 和 Enabled。然后,您可以根据需要对任何单个公寓进行修改,然后单击“保存”。

/app/models/apartment.rb

def preview
  @count = session['count'].to_i
    @mktg_apartment = []
    1.upto(@count) do |i|
    @mktg_apartment[i] = Apartment.new
    @mktg_apartment[i].rate = session['tmp_rate']
    @mktg_apartment[i].enabled = true
  end
end

/app/views/preview.html.haml

=form_for @mktg_apartment, :url => :action => 'save_preview', :method => 'post' do
  - 1.upto(@count) do |x|
    text_field "mktg_apartment[#x]", :unit
    text_field "mktg_apartment[#x]", :rate
    text_field "mktg_apartment[#x]", :enabled

我还没有真正创建我的保存方法。我会发布我所拥有的,在某一时刻它只会保存最后输入的记录,但我知道这一切都错了。

/app/model/apartment.rb

def save_preview
  @mktg_apartment = Mktg::Apartment.new(params[:mktg_apartment])
  respond_to do |format|
    if @mktg_apartment.save
      format.html  redirect_to mktg_apartments_path 
    else
      format.html  render action: "preview" 
    end
  end
end

在我的 preview.html.haml 表单中,我转储了 @mktg_apartment 并看到以下内容:

[nil, #<Mktg::Apartment id: nil, created_at: nil, updated_at: nil, unit: nil, rate: 1222.0, enabled: true>, 
#<Mktg::Apartment id: nil, created_at: nil, updated_at: nil, unit: nil, rate: 1222.0, enabled: true>,
#<Mktg::Apartment id: nil, created_at: nil, updated_at: nil, unit: nil, rate: 1222.0, enabled: true>,
#<Mktg::Apartment id: nil, created_at: nil, updated_at: nil, unit: nil, rate: 1222.0, enabled: true>,
#<Mktg::Apartment id: nil, created_at: nil, updated_at: nil, unit: nil, rate: 1222.0, enabled: true>]

当我点击保存错误时,我看到以下参数被传递到我的帖子表单:

"utf8"=>"✓",
"authenticity_token"=>"iGLdu/ZmulcLp4xZEU4a4iuxWV1opzNIyXcnZEQCtj8=",
"mktg_apartment"=>"1"=>"unit"=>"",
"rate"=>"",
"enabled"=>"0",
"2"=>"unit"=>"",
"rate"=>"",
"enabled"=>"0",
"3"=>"unit"=>"",
"rate"=>"",
"enabled"=>"0",
"4"=>"unit"=>"",
"rate"=>"",
"enabled"=>"0",
"5"=>"unit"=>"",
"rate"=>"",
"enabled"=>"0",
"commit"=>"Save",
"method"=>"post"

所以看起来我在预览方法中设置的@mktg_apartment 数组在我的预览视图中没有被正确访问。实际上,我的预览视图看起来像我期望的那样将参数传递给 save_preview post 方法。

请大家帮忙,我的头撞墙了。谢谢...

【问题讨论】:

【参考方案1】:

我会使用嵌套表单。将单位拆分成一个单独的模型,并有类似地块(block)的东西有很多单位。然后您可以使用复杂的表格输入所有信息。

参考:http://railscasts.com/episodes/196-nested-model-form-part-1

块模型可以保存整个块的大小,单元模型可以保存特定单元的详细信息。

【讨论】:

好的,所以请创建一个建筑模型,该模型将保存有关该建筑的任何信息,然后该建筑有_many 个公寓。这真的是我唯一在这里,还是最简单的方法?还有更多我认为你是对的。谢谢! 这是最简单也是最佳实践的做事方式。请记住,如果建模太难,那么您很可能必须将其拆分为单独的模型。

以上是关于Rails 3 从单个模型和方法创建多个记录条目的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP:从单个模型中检索多个记录以以一种形式进行编辑

如何为单个模型保存多个单独的记录

- 更新 - Rails API 应用程序使用来自控制器的 POST 请求一次创建不同模型的多个嵌套记录

优化重复 Rails 代码的正确方法

从视图编辑模型上的多个属性的 Rails 方法

如何从多个模型记录中添加整数? [导轨]