模型之外的Rails验证

时间:2011-04-25 03:46:41

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

我需要对我的消息表单进行验证,其中此人输入电子邮件,并且电子邮件将表单指向将接收消息的人员的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

提前致谢!

---- ---- EDIT

正如我在上面的评论中所说,我在message.rb中添加了一行

validates :to, :format   => { :with => email_regex, :message => "Email possui formato incorreto" }

但是做了一些测试我发现我再也无法打开我的消息了,我得到一个错误说:

Validation failed: To Email possui formato incorreto

有任何线索吗?

3 个答案:

答案 0 :(得分:1)

这一行

@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

我希望这会有所帮助。

答案 1 :(得分:0)

您可以通过javascript进行客户端检查,或者您可以进行自定义验证:http://www.perfectline.ee/blog/building-ruby-on-rails-3-custom-validators(您使用的是rails 3吗?)

答案 2 :(得分:0)

因此,如果我理解正确,您会收到一封您不想存储在模型中的电子邮件,因为没有这样的字段。

执行此操作的方法是使用form_tag而不是form_for来创建自定义表单。然后,您可以拥有所需的非模型属性。

要检查这是否是正确的邮件,您将在创建操作中收到参数,并使用一种方法检查这是否是有效的电子邮件。如果没有,它会闪烁错误信息并重定向到页面,如果你想要的话。