如何使用输入日期创建记录并使用 ROR 保存参数?

How can create records using input date and save the param using ROR?

我正在尝试根据某人选择日期生成记录,它将根据输入值保存更多记录。

控制器

##./app/controller/user_job_controller.rb
def new
  @user_job = UserJob.new
end

def user_job_params
  params.require(:user_job).permit!
end

型号

#user_job.rb
after_save :save_default_values, :if => :new_record?

private
  def save_default_values

    if params[:dateadd].to_i > 0
      params[:dateadd].to_i.times do |i|
         self.name = params[:name]      
         self.dateuser = params[:dateuser] + i+ 1.day
      end
    else
      self.name = params[:name]
      self.dateuser = params[:dateuser]          
    end
    
  end    

查看

<%= form_with(model: user_job) do |form| %>
   Name:<%= form.text_field :name %>
   Date: <%= text_field_tag "dateuser", params[:dateuser].to_i %>
   Date added: <%= text_field_tag "dateadd", params[:dateadd].to_i %>
   <%= form.submit %>
<% end %>

数据示例:

 #form values
 Name: test
 Date: 23-09-2021
 days added: 2

想要的结果:

 #it will do on console or ruby on rails logs
  insert into user_jobs (id:1, name:test, dateuser: 23-09-2021),
  insert into user_jobs (id:2, name:test, dateuser: 24-09-2021),
  insert into user_jobs (id:3, name:test, dateuser: 25-09-2021),

日志显示不是

Processing by UserJobsController#create as HTML
 Parameters: {"authenticity_token"=>"[FILTERED]", "user_job"=>{"name"=>"test"}, "dateuser"=>"2021-09-24", "dateadd"=>"2", "commit"=>"Create User job"}
 Unpermitted parameter: :name

结果日志:

  insert into user_jobs(created_at: 23-09-2021)

你能帮我正确保存数据吗?

代码中存在一些问题。

1。参数只能在控制器中访问,您想在模型中读取它

有多种方法可以将params值传递给模型,例如,您可以在模型中添加attr_accessor :dateadd。 但我认为更清晰的方法是将 :save_default_values 中的行为提取到 new public 方法中 并在控制器中调用它。

2。 params[:name] 是模型中的一个属性,你应该使用强参数来分配属性

3。显然 dateuser 是 user_jobs 的一列,不是吗?

我们可以使用date_field来选择日期,并将此字段添加到强参数中。

4。记录保存后,该记录不再是新记录,因为它有 id 值。

尝试使用after_createafter_save on: :create。然而,我并没有在下面的代码中使用这个回调,但这只是个人选择:)

# user_job.rb
class UserJob < ApplicationModel
  # add new public method
  def add_additional_jobs!(days)
    (1..days).each do |n|
      UserJob.create!(name: name, dateuser: dateuser + n.days)
    end
  end
end

# user_jobs_controller.rb
class UserJobsController < ApplicationController
  def new
    @user_job = UserJob.new
  end

  def create
    UserJob.transaction do
      @user_job = UserJob.create!(user_job_params)
      if params[:dateadd].to_i > 0
        @user_job.add_additional_jobs!(params[:dateadd].to_i)
      end
    end
  end
  
  private

  def user_job_params
    params.require(:user_job).permit(:name, :dateuser)
  end
end

然后在视图中

<%= form_with(model: user_job) do |form| %>
  Name:<%= form.text_field :name %>
  Date: <%= form.date_field :dateuser %>
  Date added: <%= text_field_tag "dateadd", params[:dateadd].to_i %>
  <%= form.submit %>
<% end %>