【问题标题】:How to retain PORO Form object field inputs?如何保留 PORO 表单对象字段输入?
【发布时间】:2020-10-06 10:43:57
【问题描述】:

我创建了一个 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

这是控制器

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

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4


    【解决方案1】:

    问题很可能是您在没有调用 super 的情况下覆盖了初始化方法。这会打乱由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 中存储的属性

    相反,您可能应该完全重新考虑这一点并使用委托:

    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
    

    【讨论】:

      猜你喜欢
      • 2013-01-04
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多