我无法保存从一个视图中以多种形式发送的请求中的数据。其中一个已保存,但我无法获取其余数据以保存在第二个模型中。 Model Soil引用了Job。
我阅读了很多关于从多个模型保存数据的教程,但是我找不到解决方案。我是红宝石编程的新手。
def create
@job = Job.new(job_params)
if @job.save
@soil = @job.soils.new()
@soil.save
flash[:notice] = 'Added'
redirect_to @job
end
end
private
def job_params
params.require(:job).permit(:name, :samples, :duedate, :soil_attributes => %i[shelf count_samples initials])
end
{"utf8"=>"✓",
"authenticity_token"=>"WRhC3Dffq290lK5u2tnITJWT244ZLlwoAnm/T1tWdw3/UbUUpIOuB0ziclkuMFnIZ8KWZllFZlQrBP/quyb33g==",
"job"=>{"soil"=>{"initials"=>"AWO", "shelf"=>"A3", "count_samples"=>"4"}, "name"=>"19-35123", "samples"=>"4", "duedate"=>"2019-05-21"},
"button"=>""}
工作模型
class Job < ApplicationRecord
has_many :soils
before_save :default_value
validates_presence_of :name, :samples, :duedate
accepts_nested_attributes_for :soils
private
def default_value
self.archived ||= false
end
end
class Soil < ApplicationRecord
belongs_to :job
end
答案 0 :(得分:1)
这基本上只是以下内容的重复:https://stackoverflow.com/a/12980775/8844929。我建议您遵循他们的建议:
工作模型/app/models/job.rb
:
class Job < ActiveRecord::Base
has_many :soils
accepts_nested_attributes_for :soil
在/app/models/soil.rb
中:
class Soil < ActiveRecord::Base
belongs_to :job
在app/controllers/jobs_controller.rb
中:
def create
@job = Job.create(params[:job])
if @job.save
flash[:notice] = 'Added'
redirect_to @job
end
end
由于作业接受土壤的嵌套属性,因此它还将保存新的土壤对象(如果传递)。您可能必须在html.erb
文件中更改表单,但这可能是在belongs_to
关系中创建父级和子级的最干净的方法。您甚至可以使用以下参数更新土壤对象:
{ job: { name: 'thingy', soil_attributes: { id: '2', shelf: 'A4' } } }
文档可在此处找到:https://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html
看来您的参数才是真正的问题。您的表单应该具有用于创建土壤的内容:
<%= form_for @job, do |f| %>
.. omitting form fields for job
<%= f.fields_for :soil do |ff| %>
.. omitting form field for soil
<% end %>
<%= f.submit %>
<% end %>
答案 1 :(得分:0)
您似乎已将两个模型与Soil
belongs_to
Job
相关联。如果是这样,您可以将参数autosave: true
添加到belongs_to
模型中的Soil
关联中。
编辑
是的,现在我可以看到您的模型了,这应该可以满足您的需求:
belongs_to :job, autosave: true
您甚至还可以添加dependent: :destroy
。它有助于清理:
belongs_to :job, autosave: true, dependent: :destroy