对rails很新,请原谅noob问题。在通过AJAX捕获电子邮件时遇到一些麻烦。
所需功能 我正在为我的网站创建一个登录页面,用于捕获电子邮件(" Leads" = object / model)。我想异步捕获电子邮件,然后向用户显示感谢信息。如果用户输入无效的电子邮件,我想让他们输入正确的电子邮件。
我的工作 我可以正确捕获电子邮件并通过AJAX执行验证。如果我输入无效的电子邮件,请单击"提交",它不会显示在/ leads / index上。如果我输入无效的电子邮件,则会显示在/ leads / index。
我没有工作 我还没弄明白如何将任何类型的响应反馈给用户。如果保存成功,我想要做的就是更改h3(class =" results")元素的文本。
我的代码
landing.html.erb:
<h3 class="results">Give us your e-mail and we'll send you an invite to beta when it's ready.</h3>
<%= form_for(:lead, remote: true, :url => {:controller => 'leads', :action => 'create'}, :html => {:class => 'form-inline emailForm'}) do |f| %>
<div class="form-group">
<%= f.label(:email, 'E-mail', class: 'sr-only') %>
<%= f.text_field(:email, {:id => 'submitEmail2', :class=> 'form-lg', :placeHolder => 'E-mail Address'}) %>
</div>
<%= submit_tag("Sounds Good", {:id => 'submitEmail2', :class => 'btn btn-success btn-lg'}) %>
<% end %>
leads_controller.rb
class LeadsController < ApplicationController
layout false
#respond_to :html, :js
def index
@leads = Lead.order("created_at ASC")
end
def show
end
def new
end
def create
@lead = Lead.new(lead_params) #Create a new object without form parameters
end
def edit
end
def delete
end
private
def lead_params
params.require(:lead).permit(:email)
end
end
create.js.erb
$('h3.results').html("");
//If I remove this code, it works
<% if @lead.save? %>
$("h3.results").html("Thank you! We'll let you know when it's ready."));
$('.emailForm').hide();
<% else %>
$("h3.results").html("Invalid E-mail. Please try again!"));
<% end %>
如果我删除create.js.erb中的最后一段代码,一切正常,h3中的文本将被删除。 save语句有什么问题?我是在代码的正确部分进行保存,还是应该在控制器中?
感谢所有帮助!
答案 0 :(得分:1)
我相信你收到了错误:
<% if @lead.save? %>
您应该在控制器中执行保存:
def create
lead = Lead.new(lead_params)
@saved = lead.save
end
请注意使用save
而不是save?
然后,您可以使用@lead.save
@saved
是否成功
$('h3.results').html("");
<% if @saved %>
$("h3.results").html("Thank you! We'll let you know when it's ready."));
$('.emailForm').hide();
<% else %>
$("h3.results").html("Invalid E-mail. Please try again!"));
<% end %>
答案 1 :(得分:1)
新的铁路
欢迎!
我还没弄明白如何将任何类型的回复反馈给用户
Ajax
响应始终在请求完成时发回。
你如何处理它取决于你。
您可以通过查看浏览器中network
的{{1}}标签来查看回复。在Chrome中,您可以devloper console
:
您提交表单时,您将能够看到发送的请求。
未显示在/ leads / index
上
您遇到的问题是right-click > Inspect Element > Network
功能。
如save
所述,您最好在控制器操作中保存记录(这可以直接访问模型):
cweston
这将允许您使用以下(new_record?
):
def create
@lead = Lead.new lead_params
@lead.save
respond_to do |format|
format.js #-> app/views/leads/create.js.erb
end
end
这使您能够管理DOM中的HTML元素。
<强>响应强>
就您的回答而言,您使用内置服务器端JS的事实很棒;我为此鼓掌。
您可以处理响应的其他方式是使用客户端Ajax。您不需要这样做,因为您正在使用Rails UJS驱动程序,但无论如何您都可以这样做:
#app/views/leads/create.js.erb
<% message = @lead.new_record? "Invalid Email. Please try again!" : "Thank you! We'll let you know when it's ready" %>
$("h3.results").html("<%=j message %>");
<% unless @lead.new_record? %>
$('.emailForm').fadeOut(500, function(){
$(this).remove();
});
<% end %>
答案 2 :(得分:0)
<强>答案强>
我是个白痴。错误是因为$('h3.results')
次调用结束时出现双括号。