gpt4 book ai didi

ruby-on-rails - 如何保留 PORO 表单对象字段输入?

转载 作者:行者123 更新时间:2023-12-04 15:16:32 25 4
gpt4 key购买 nike

我创建了一个 R-o-R Form 对象,它接收属性,然后将这些属性保存到一些嵌套对象中,但是,在验证失败时,输入值消失。有没有办法留住他们?

class FormObject
include ActiveModel::Model
attr_accessor(:name, :date)

def initialize(params = {})
@params = params
end

def save
return if invalid?
no = NestedObject.new(nested_object_params)
no.save
end

def nested_object_params
@params.permit(:name, :date)
end
end
这是 Controller
class Controller
def new
@form = FormObject.new
end

def create
@form = FormObject.new(form_object_params)
if @form.save
redirect_to ...
else
render :new
end
end

def form_object_params
params.require(:form_object).permit(:name, :date)
end
end

最佳答案

问题很可能是您在没有调用 super 的情况下覆盖了 initialize 方法。这搞乱了 ActiveModel::AttributeAssignment 完成的整个属性映射。表单真正依赖它来获取模型的属性。

class FormObject
include ActiveModel::Model
attr_accessor(:name, :date)

def initialize(params = {})
@params = params
super
end

def save
return if invalid?
no = NestedObject.new(nested_object_params)
no.save
end

def nested_object_params
@params.permit(:name, :date)
end
end
如果您使用 ActiveModel::Attributes而不是 Ruby 内置的 attr_accessor您可以像使用 ActiveRecord 支持的属性一样进行类型转换。
但这是一场直接的灾难,因为您现在拥有相同数据的三种不同表示形式:
  • FormObject 上的实例变量
  • 存储在@params
  • 中的哈希值
  • 存储在 NestedObject 中的属性

  • 相反,您可能应该完全重新考虑这一点并使用委托(delegate):
    class FormObject
    include ActiveModel::Model
    attr_accessor :object
    delegate :name, :name=, :date, :date=, :save, to: :object

    def intialize(**attributes)
    @object = NestedObject.new(attributes)
    super
    end
    end

    关于ruby-on-rails - 如何保留 PORO 表单对象字段输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64224196/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com