在一个视图中将数据从多种形式保存到多种模型的问题

时间:2019-04-25 17:41:10

标签: ruby-on-rails

我无法保存从一个视图中以多种形式发送的请求中的数据。其中一个已保存,但我无法获取其余数据以保存在第二个模型中。 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

2 个答案:

答案 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