Rails - AJAX创建方法和响应问题

时间:2015-10-22 02:38:16

标签: jquery ruby-on-rails ajax email

对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语句有什么问题?我是在代码的正确部分进行保存,还是应该在控制器中?

感谢所有帮助!

3 个答案:

答案 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

enter image description here

您提交表单时,您将能够看到发送的请求。

  

未显示在/ 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')次调用结束时出现双括号。