【问题标题】:rails MailForm doesn't go through validationrails MailForm 没有通过验证
【发布时间】:2015-01-01 16:52:45
【问题描述】:

我无法进行验证:

我的 Contact.rb 模型:

class Contact < MailForm::Base


    attribute :name  
    attribute :e_mail    
    attribute :message

  validates_presence_of :name 
  validates_format_of :e_mail, :with =>  /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i
  validates_presence_of :message

  def headers
    {
      :subject => "Kontaktu forma",
      :to => "myemail@domain.lv",
      :from => %("#{name}" <#{e_mail}>)
    }
  end
end

contacts_controller.rb:

class ContactsController < ApplicationController
  respond_to :html, :js
     def new
    @contact = Contact.new
  end

  def create
    @contact = Contact.new(params[:contact]).deliver
  end
end

new.js:

$("#main-block").html("<%= escape_javascript(render 'contact_form') %>")

_contact_form.html.erb:

  <%= form_for :contact, :remote => true, :html => {:class => 'form-horizontal' } do |f| %>

        <%= f.label :name, class: "control-label" %>
          <%= f.text_field :name %>

        <%= f.label :e_mail, class: "control-label" %>
          <%= f.email_field :e_mail %>

        <%= f.label :message, class: "control-label" %>
          <%= f.text_area :message %>
      </br>
            <%= f.submit('Send', class: "btn btn-primary")  %>
  <% end %>

create.js:

 <%= render 'save' %>

_save.js.erb:

$("ul.errors").html("")
<% if @mail.errors.any? %>
  <% @mail.errors.full_messages.each do |message| %>
    $("ul.errors").append($("<li />").html("<%= message.html_safe %>"))
  <% end %>
<% else %>
  $("#main-block").empty()
  $("#main-block").html("Ziņa ir nosūtīta. Tuvākajā laikā sniegsim atbildi!")
<% end %>

之前我因为没有 .errors 方法而出错,但不知何故我修复了它,现在它绕过所有验证并简单地接受我的 save.js.erb 的 POST 请求

编辑:奇怪的是,一切似乎都通过控制台正常工作。

编辑 2:尝试将 form_for 从 :contact 更改为 @contact,现在我在 _save.js.erb 中得到 nil:NilClass 方法的未定义方法 `errors'

【问题讨论】:

  • 您能否将new.html.erb 添加到您的代码示例中?
  • 我没有 new.html,因为它在访问 contact_us 页面时使用 AJAX 请求。这就是为什么我有 new.js 和部分表单来渲染

标签: jquery ruby-on-rails-4 mail-form


【解决方案1】:

我认为nilClass 问题可能是因为deliver 方法没有返回Contact。而且我看不到您调用验证方法的任何地方。 大多数 AR 对象在 valid?save 上调用验证。由于您没有在此处明确保存任何内容,因此我不确定验证预计何时发生。但你可以明确地说出来……比如

@contact = Contact.new(params[:contact])
@contact.deliver if @contact.valid?

这应该可以解决您遇到的nilClass 问题,这可能是因为现在@contact 是一个真正的`Contact 对象。此外,您正在显式调用验证方法。

【讨论】:

  • 太棒了。这有帮助。他们可能应该在 MailForm gem 描述中添加这个,因为对于像我这样的初学者来说,通过像有效的显式方法进行验证?或者保存是新闻。
  • 该验证模式是为ActiveRecord 设置的。因为这是gem,所以有点不同也就不足为奇了,但你是对的。在mail_form gem's 文档中添加一点注释不会有什么坏处。您可以在他们的github issue tracker 上提出问题,他们将来可能会解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多