Ruby on rails 从Rails表单创建批量对象-使用Integer设置对象数量
在Rails 5.1中,我想使用一个表单,该表单将根据表单中指定的对象数量创建对象。例如,我有以下字段: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,
<%= 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