将临时(非数据库)模型与simple_form关联

时间:2018-07-20 19:27:51

标签: ruby-on-rails simple-form

我有一个simple_form,它实际上不适用于普通模型。如果我将对象设置为:thing,它似乎可以工作。

但是,我希望它具有一些验证。在其他问题中,我发现这意味着我需要一个模型...但是,我不确定该模型中需要包含什么。所以,我做了模型,但是我不知道如何将它们连接起来。

class ClientEmail
  include ActiveModel::Validations

  validate :cannot_be_present

  attr_accessor :to_domain

  def cannot_be_present
    newDomClients = Client.where("email like :foo", {:foo => "%#{to_domain}%"})
    errors.add(:base, "There cannot be any emails already in the database with the target domain" ) if newDomClients.length > 0
    end
end

而simple_form是:

= simple_form_for(@client_email, url: { action: "update" }, html: {class: "search_form",  method: :put }) do |f|
  .input-row
    = f.input :newDomain, :label => "New domain name", :required => true

(等)

最初,它说@client_email为nil,所以我用以下方法对其进行了初始化(考虑到Rails,似乎不太必要):

- @client_email = ClientEmail.new

但是这告诉我ClientEmail没有to_key方法,因此我显然在某处缺少大量基础结构。

2 个答案:

答案 0 :(得分:0)

如果使用包含属于模型的对象创建表单,则无法创建不属于该模型的字段。您需要创建这样的表单才能做到这一点:

= simple_form_for(:client_email, url......)

如果使用这样的符号创建表单,则可以在此表单中创建任何字段并将其发送到所需的控制器。 params哈希不会改变太多,您可以像这样调用您的特殊字段:

params[:client_email][:your_field_name]

由于此字段不属于模型,因此最好在控制器中对其进行验证。

希望有帮助。

答案 1 :(得分:0)

看来我需要:

  include Virtus.model
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

我不确定Virtus是什么。没有它可能是有可能的,但这是我已经拥有的图书馆...