尝试验证联系表单

时间:2012-02-29 00:16:01

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

我是一个完整的rails新手,我正在尝试为联系表单创建验证。我已启动验证代码,但如果我只是加载我的联系页面并单击“提交”,则不会显示任何验证错误。

以下是我认为的表格:

  <%= form_for :message, :id => 'contactForm', :url => { :action => "create" } do |f|-%>

        <%= label_tag 'name', 'Name:' %>
        <%= f.text_field 'name', :class =>'required requiredField' %> 

        <%= label_tag 'email', 'Email:' %>
        <%= f.email_field 'email', :class =>'required requiredField email' %>

        <%= label_tag 'message', 'Message:' %>
        <%= f.text_area 'message', :class => 'required requiredField', :rows => 20, :cols => 30 %>

        <%= f.submit :class => 'button' do -%>
            <a href="#" class="button" style="float:right;"><span>Submit</span></a>
        <% end %>
    <% end -%>

控制器:

class ContactController < ApplicationController

    layout "content"

    def index
        @activeLi = "contact"
    end

    def new
        @message = Message.new
    end

    def create
        @message = Message.new(params[:message])

        if @message.valid?
            # need to actually send the email message here
            flash[:notice] = "Message sent! We will get back to you shortly."
            redirect_to root_url
        else 
            render :action => 'new'
        end
    end

end

型号:

class Message

    include ActiveModel::Validations
    include ActiveModel::Conversion
    extend ActiveModel::Naming

    attr_accessor :name, :email, :message

    validates_presence_of :name, :email, :message
    validates_length_of :message, :maximum => 4000

    def initialize(attributes={})
        attributes.each do |name, value|
            send("#{name}=", value)
        end
    end

    def persisted?
        false
    end
end

路线:

get "contact/index"
post "contact/create"

3 个答案:

答案 0 :(得分:2)

您正在将表单发布回:index操作,但是您没有在:index操作中尝试创建和保存ContactModel的实例。在你这样做之前,它永远不会验证。你想在你的:index action:

中添加这样的东西

if request.post?   cm = ContactModel.new(... params go here ...)   如果cm.save     # 一切都很好   其他     #吐出错误   结束 端

我建议不要命名你的模型“ContactModel”(摆脱'模型')。 ContactRequest,ContactSubmission等......类似的东西。

另外,请查看http://railscasts.com/episodes/326-activeattr。非常适合你正在做的事情。

最后,将form_tag切换为form_for并使用模型的新实例。让东西保持干净整洁。

答案 1 :(得分:1)

我自己是Rails的新手 - 现在只学习了一个月。如果我理解正确,您希望在提交表单时显示错误。由于模型中的validates_presence_of,我希望在没有正确值的情况下提交时,您的模型不会保存到数据库中。您可能需要在form_for标记下面的表单中使用以下代码。然后会显示任何验证错误。

<% if @message.errors.any? %>
<h4>Errors</h4>
<ul>
    <% @message.errors.full_messages.each do |message| %>
        <li><%= message%></li>
    <% end %>
</ul>
<% end %>

答案 2 :(得分:1)

将routes.rb中的帖子行更改为

post 'contact/create'
get 'contact/new'