我是一个完整的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"
答案 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'