大家好我想尝试使用相同的表单将多个记录插入到表中,到目前为止我已经实现了以下内容
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
那么有没有其他方法可以同时在表格中插入多条记录?或者我该如何解决这个问题?
答案 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,所以请确保并设置强大嵌套属性的参数。)