Ruby on Rails的定制功能验证和发布
问题描述:
我已创建一个controller
名为Invites
和一个名为invite
model
,我已经创造了一种我要使用用户输入他们的电子邮件地址控制器命名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
)