Ruby on Rails的定制功能验证和发布

问题描述:

我已创建一个controller名为Invites和一个名为invitemodel,我已经创造了一种我要使用用户输入他们的电子邮件地址控制器命名request_invite一个新的功能,验证它而且它不会在邀请表中存在,然后将其上传到数据库Ruby on Rails的定制功能验证和发布

invites_controller.rb

class InvitesController < ApplicationController 

    def request_invite 
     render_404 unless request.xhr? 

     @email = params[:get_invited_email] 

     if @email 
      flash[:notice] = "msg + insert" 
     else 
      flash[:notice] = "msg" 
     end 

    end 

end 

invite.rb

class Invite < ActiveRecord::Base 

end 

我还没有添加的路由资源文件

形式

<%= form_tag(invite_request_path, :method => "post", :id => "landing_request_invite_form") do %> 
    <%= text_field_tag 'get_invited_email', nil, :placeholder => 'Enter your email address' %> 
    <%= submit_tag 'Get Invited', :id => "get_invited_btn" %> 
<% end %> 

的JavaScript

$("#landing_request_invite_form").submit(function(e){ 
    e.preventDefault(); 
    var form = $(this); 
    var url = form.attr("action"); 
    var formData = form.serialize(); 
    $.post(url, formData, function(html) { 
     console.log('request done'); 
    }); 
    return false; 
    }); 

我怎么能检查电子邮件不存在?我使用.find()方法吗?

我会在我的答案中假设Invite模型在DB中有一个invite_email列。

class Invite < ActiveRecord::Base 
    validates :invited_email, :uniqueness => true 
end 

class InvitesController < ApplicationController 
    def request_invite 
     render_404 unless request.xhr? 

     @invitation = Invite.new(params[:invite]) 
     if @invitation.save 
      flash[:notice] = "msg + insert" 
     else 
      flash[:notice] = "msg" 
     end 
    end 
end 

<%= form_for Invite.new, :url => invite_request_path, :id => "landing_request_invite_form" do |f| %> 
    <%= f.text_field :invited_email, :placeholder => 'Enter your email address' %> 
    <%= f.submit 'Get Invited', :id => "get_invited_btn" %> 
<% end %> 

简要说明:

@invitation.save经过验证,如果对象是无效返回false,因为我们在我们的邀请模型把validates :invited_email, :uniqueness => true如果用相同INVITED_EMAIL值已经存在邀请它不会是有效的。

我还想建议您将request_invite动作更改为create动作。我认为没有理由不 - 你正在做的就是创建一个新的邀请。如果这样做,则可以省略来自构建器的:url => invite_request_path,因为当表单对象是新实例时,rails会默认进入创建操作(如Invite.new