我需要对我的消息表单进行验证,其中人员输入电子邮件,电子邮件将表单定向到将接收消息的人员的id。
Email:<br />
<%= f.text_field :to %>
<%= error_message_on @message, :to %>
...
<%= submit_tag "Send" %>
我的问题是,我需要为这个表单创建一个验证,以便只接受电子邮件,但是Message模型本身没有电子邮件。最好的尝试是什么?
创建如下
def create
@message = Message.new(params[:message])
@message.sender = @profile
@message.recipient = Profile.find_by_email(params[:message][:to])
if @message.save
flash[:notice] = "Message sent"
redirect_to profile_messages_path(@profile)
else
render :action => :new
end
end
提前感谢!
——编辑——
正如我在上面的评论中所说,我添加了一个消息。行
validates :to, :format => { :with => email_regex, :message => "Email possui formato incorreto" }
但是做一些测试,我发现我不能再打开我的消息,我得到一个错误说:
Validation failed: To Email possui formato incorreto
什么线索吗?
这一行
@message = Message.new(params[:message])
如果Message模型上没有to=方法,应该抛出错误。所以我假设,你已经有了这种"虚拟属性",所以让我们这样说:
def to
@to
end
def to=(value)
@to = value
end
验证正确的电子邮件地址,您可以将此添加到模型中:
validate :validate_email
def validate_email
errors.add :to, :invalid unless to.match /some email validation regex/
end
所以如果我理解正确,你会收到一封电子邮件,你只是不想存储在你的模型中,因为没有这样的字段。
一种方法是使用form_tag而不是form_for来创建自定义表单。然后,您可以拥有任意多的非模型属性。要检查这是否是一个正确的邮件,您将在创建操作中接收参数,并有一个方法来检查这是否是一个有效的邮件。如果没有,它会闪烁一个错误消息,并重定向到一个页面,如果你需要的话。
你可以通过javascript做客户端检查,或者你可以做自定义验证:http://www.perfectline.ee/blog/building-ruby-on-rails-3-custom-validators(你使用rails 3吗?)