从单个表单Rails 4插入多个值

时间:2014-10-16 09:47:15

标签: ruby-on-rails ruby-on-rails-4

大家好我想尝试使用相同的表单将多个记录插入到表中,到目前为止我已经实现了以下内容

class ProjectController < ApplicationController
def new
    @project = Project.new
end
def create

    @projec = Project.new(project_params)
    respond_to do |format|
      if @project.save
        format.html {  flash[:notice] = 'User successfully created.' and redirect_to action: "index"}

        format.json { render :show, status: :created, location: @project }
      else
        format.html { render :new }
        format.json { render json: @project.errors, status: :unprocessable_entity }
      end    
    end
  end
def project_params
      params.require(:project).permit(:PROJECT_ID,:COMPANY_ID, :ASSESSMENT_ID, :PROJECT_SCORE , :CREATED_BY, :UPDATED_BY)
    end
end

所以在我的视图中我使用了这样的,因为我只希望将项目级别分数保存到数据库中,所有其他值保持不变

<% 10.times do %>
    <%= f.range_field :PROJECT_SCORE[], :min=>0, :max=>10, :class=>"slide", :id=>"slider1", name: 'PROJECT_SCORE[of_values][]'%>
        <% end %>

接下来在我的模型中我使用过这样的

class Project< ActiveRecord::Base
  serialize :PROJECT_SCORE ,Array
end

但我收到错误

Attribute was supposed to be a Array, but was a Fixnum. -- 0

那么有没有其他方法可以同时在表格中插入多条记录?或者我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

有一种插入多个记录的替代方法,我强烈建议这样做。你可以让这个工作,但它感觉有点hacky,对我来说不是很灵活。请尝试使用 has_many 关联和嵌套表单。如果您不熟悉has_many关联,则在codeschool.com上有一个名为 Models Taste Like Chicken 的入门课程。还有一个很棒的 RailsCasts episode (#196) ,详细介绍了嵌套表单和一些很酷的AJAX功能。

为此,您可以创建一个名为Score的模型,并告诉它属于项目:

rails g model Score score:integer project:references

class Score < ActiveRecord::Base
  belongs_to :project
end

每个项目都有很多分数:

class Project < ActiveRecord::Base
  has_many :scores, dependent: :destroy
  accepts_nested_attributes_for :scores, allow_destroy: true
end

依赖性破坏确保在删除项目时删除相关分数。您还需要告诉它接受分数模型的嵌套属性。详细信息 here

接下来,使用things_attributes:[:thing1, :thing2, :etc]

设置强参数
class ProjectController < ApplicationController

### other stuff

def project_params
  params.require(:project).permit(:PROJECT_ID, :etc, scores_attributes: [:id, :score])
end
  

我想在此提及的一件事是最好的做法   命名约定是使用snake_case为您的   变量和数据库名称。因此,而不是:PROJECT_ID命名它   :project_id
  ALL_CAPS通常用于常量。

现在您的视图可以使用fields_for表单帮助器在表单块中创建另一个表单块。

<%= form_for @project do |f| %>
  <div class="field">
    <!-- all normal form inputs -->
  </div>

  <!-- and now the nested form -->
  <%= f.fields_for :scores do |ff| %>
    <div class="field">
      <%= ff.range_field :score %>
    </div>
  <% end %>

  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %> 

这不允许你创建新的分数,但这开始变得非常复杂,并在我上面提到的RailsCasts中解释(但是他使用的是较旧版本的rails,所以请确保并设置强大嵌套属性的参数。)