Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 从Rails表单创建批量对象-使用Integer设置对象数量_Ruby On Rails_Ruby_Forms - Fatal编程技术网

Ruby on rails 从Rails表单创建批量对象-使用Integer设置对象数量

Ruby on rails 从Rails表单创建批量对象-使用Integer设置对象数量,ruby-on-rails,ruby,forms,Ruby On Rails,Ruby,Forms,在Rails 5.1中,我想使用一个表单,该表单将根据表单中指定的对象数量创建对象。例如,我有以下字段: <%= form_for(@object, remote: true, html: {"data-type" => :json, id: "object_new"}) do |f| %> <%= f.label :name, "Object Name", for: "object_name" %> <%= f.text_field :name,

在Rails 5.1中,我想使用一个表单,该表单将根据表单中指定的对象数量创建对象。例如,我有以下字段:

<%= form_for(@object, remote: true, html: {"data-type" => :json, id: "object_new"}) do |f| %>

  <%= f.label :name, "Object Name", for: "object_name" %>
  <%= f.text_field :name, type: "text", id: "object_name" %>

  <%= f.label :amount, "Amount of objects", for: "object_amount" %>
  <%= f.number_field :amount, type: "number", id: "object_amount" %>

  <%= f.label :start_at, "Start Count At...", for: "object_start_at" %>
  <%= f.number_field :start_at, type: "number", id: "object_start_at" %>

  <%= f.button 'Create New Object(s)', id: 'new_objects_submit' %>

<%end %>

我的问题是如何以最友好的方式实现这一点?我曾考虑在控制器中添加私有方法来解析数据以满足我的需要,并在控制器的
create
方法中调用这些方法,但我觉得这可能会让我的控制器过于膨胀,当我尝试验证我的参数时,可能会引起噩梦。

在创建操作中,您可能希望执行以下操作:

class Object < ApplicationRecord
  attr_accessor :amount, :start_at
  validates :name, uniqueness: true
end
def create

  @object.amount.times do |i|
    object = Object.new do |object|
      name = @object.name.strip # => "Basic"
      number = (@object.start_at + i + 1) # => 2
      formatted_number = number < 10 ? "0#{number}" : number # => "02"
      object.name = @object.name.strip + formatted_number # => "Basic02"
    end
    object.save!
  end

end
以及
CreateObjects
服务:

# app/services/create_objects.rb 

class CreateObjects
  def self.call(object)
    new(object).call
  end

  def initialize(object)
    @object = object
  end

  def call
    ActiveRecord::Base.transaction do # will only save if _all_ the objects are saved
      @object.amount.times do |i|
        create_object(i)
      end
    end
  end

  def create_object(i)
    object = Object.new do |object|
      name = @object.name.strip # => "Basic"
      object.name = @object.name.strip + formatted_number(i) # => "Basic02"
    end
    object.save!
  end

  def formatted_number(i)
    number = (@object.start_at + i + 1) # => 2
    number < 10 ? "0#{number}" : number # => "02"
  end
end
#app/services/create_objects.rb
类CreateObjects
def self.call(对象)
新建(对象)。调用
结束
def初始化(对象)
@对象=对象
结束
def呼叫
ActiveRecord::Base.transaction do仅在保存所有对象时保存
@object.amount.times do|i|
创建对象(i)
结束
结束
结束
def创建_对象(i)
object=object.new do | object|
name=@object.name.strip#=>“基本”
object.name=@object.name.strip+格式化的_编号(i)#=>“Basic02”
结束
object.save!
结束
def格式化的数字(i)
数字=(@object.start_at+i+1)#=>2
数字<10?“0{number}”:number}=>“02”
结束
结束

谢谢你的回答。我对Rails中的服务对象一无所知。如果有一个
object.save
如果失败,则使整个表单提交失败并用json/html响应?不客气@Wes,我已经更新了上面的示例。如果您想确保保存所有对象,您可以将其包装在事务中(获取更多信息)。Re:处理
respond\u to
内容-如果没有出现错误,(我认为)它将返回
true
-在这种情况下,您可以检查true,并返回一条成功消息。如果出现任何错误,您将希望从
CreateObjects
服务返回这些错误。今晚晚些时候我将更新这个示例:)看起来ActiveRecord事务将简单地返回块,而不管它是成功还是失败,而不是true还是false。我尝试使用
rescue
来摆脱错误,但这意味着使用自定义json消息作为响应,我不一定喜欢。我还在玩它。。。
def create
  if CreateObjects.call(@object)
    respond_to do |format|
      format ... #success
    end
  else
    respond_to do |format|
      format ... #failure
    end
  end
end
# app/services/create_objects.rb 

class CreateObjects
  def self.call(object)
    new(object).call
  end

  def initialize(object)
    @object = object
  end

  def call
    ActiveRecord::Base.transaction do # will only save if _all_ the objects are saved
      @object.amount.times do |i|
        create_object(i)
      end
    end
  end

  def create_object(i)
    object = Object.new do |object|
      name = @object.name.strip # => "Basic"
      object.name = @object.name.strip + formatted_number(i) # => "Basic02"
    end
    object.save!
  end

  def formatted_number(i)
    number = (@object.start_at + i + 1) # => 2
    number < 10 ? "0#{number}" : number # => "02"
  end
end