【问题标题】:undefined method `persisted?' with Reform and Virtus model未定义的方法“持续存在?”与改革和美德模型
【发布时间】:2017-07-03 16:38:28
【问题描述】:

我目前正在开发一个 Rails 应用程序(rails v5.1.1 和 ruby​​ v2.3.4),在我的一条路线 (/bookings/new) 上尝试使用 reform 表单对象时出现错误:

undefined method `persisted?' for #<Booking:0x007fbae9a98138>

我正在使用virtus model(在其他情况下也可以正常工作):

class Booking
  include Virtus.model

  attribute :id, Integer
  attribute :client_email, String
end

这是我的表单对象:

class BookingForm < Reform::Form
  property :client_email
end

这是我控制器上的new 操作:

def new
  @form = BookingForm.new(Booking.new)
end

这是我的部分表单:

<%= form_for @form do |form| %>
  <%= form.text_field :client_email %>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

我认为使用 virtus 模型而不是活动记录应该没有问题,因为改革以Form objects decoupled from your models 出售自己。我是不是搞错了什么?

【问题讨论】:

  • 你可以在你的Booking类中定义def persisted?,并使用你想要的任何逻辑,如果类只代表新对象,你可以返回false
  • 这似乎不是正确的方法,因为我还需要在我的 Booking 模型中实现 to_key 方法(以返回表单的元素)。之后我得到错误:undefined method input' for #<:helpers::formbuilder:0x007fbae9e10450>` (在我的输入行)。
  • 您可以使用很多东西,例如ActiveModel::Conversion(api.rubyonrails.org/classes/ActiveModel/Conversion.html) 为您提供persisted? 方法以及其他一些方法。如果需要,您也可以使用ActiveModel::Naming(api.rubyonrails.org/classes/ActiveModel/Naming.html)。
  • 糟糕,我实际上犯了一个错误,使用form.input 方法而不是form.text_field。我的错。但是ActiveModel::Conversion 包含实际上解决了我的问题!谢谢

标签: ruby-on-rails ruby reform trailblazer virtus


【解决方案1】:

@fanta 的评论似乎有所帮助,但我的长期答案是您应该避免使用 Virtus,尤其是当您正在构建一个新项目时。 Virtus 不再由它自己的团队支持,他们转向了dry-rb(dry-types 和dry-validations)

如果您需要模拟模型 - 您可以使用 dry-struct、OpenStruct 等

Reform 现在也完全支持 dry-validation 和 dry-types,这将是未来的方式(直到版本 4 才会支持你 AM) 祝你好运:-)

【讨论】:

  • 感谢您的建议!
猜你喜欢
  • 2019-04-28
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多