在导轨控制器中发出警报/通知而不重定向

时间:2016-05-30 21:45:18

标签: ruby-on-rails ruby-on-rails-4

如果电子邮件未被保存,而不使用重定向,我想闪现通知/错误。我正在为项目使用Rails 4,这是我的代码:

布局/ application.html.erb

<!DOCTYPE html>
<html>
<head>
  <title>FarFlung Jobs</title>
  <!-- /.You can include style.css into stylesheet_link_tag too. If you do so, dont forget to add style.css in asset.rb -->
  <%= stylesheet_link_tag    'application', 'jobs', media: 'all' %>
  <%= javascript_include_tag 'application' %>
  <%= javascript_include_tag 'config', 'sharebutton', 'jobsalert', 'modernizr'%>
  <%= render 'payola/transactions/stripe_header' %>
  <%= csrf_meta_tags %>
</head>
<body>
    <%=  render 'shared/navbar' %>

    <div>
      <% flash.each do |name, msg| %>
        <%= content_tag :div, msg, class: 'alert alert-info' %>
      <% end %>
    </div>

<%= yield %>
    <%=  render 'shared/footer' %>
</body>
</html>

用户/ new.html.erb

<section class="cd-form-wrapper cd-container">
    <div class="column panel panel-default">
      <div class="cd-filter"><h4>SUBSCRIBE FOR JOBS ALERT</h4></div>
      <%= simple_form_for User.new do |f| %>
          <%= f.input :email, label: false, :placeholder => 'Enter your email address...', :input_html => { :class => 'newsletter-form-field-styling' } %>
          <%= f.button :submit, 'SUBMIT', :class => 'btn-block newsletter-form-styling btn-primary submit' %>
      <% end %>
    </div>
</section>

users_controller.rb

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(secure_params)
    if @user.valid?
      @user.save
      flash.now[:notice] = "#{@user.email} is signed up for Jobs Alert."
    else
      flash.now[:alert] = 'Error Subscribing!'
    end
  end

private

  def secure_params
    params.require(:user).permit(:email)
  end
end

如何在不重定向页面的情况下将Rails Flash消息显示在我的订阅表单上?

3 个答案:

答案 0 :(得分:4)

您可以提交通过remote: true的表单。它(如您所料)远程提交您的表单,因此您可以返回一个json渲染预期的闪存。例如:

您的表单:

simple_form_for User.new, remote: true, class: 'your-form' do 
  <your code>

您的控制器

def create
@user = User.new(secure_params)
if @user.save
  render json: { status: 'success', message: "#{@user.email} is signed up for Jobs Alert." }
else
  render json: { status: 'failure', message: 'Error Subscribing!' }
end

您的JS (可能 new.js - 并确保将其包含在您的视图中)

// you can specify your bind container, here I just used the document
$(document).on('ajax:success', '.your-form', function(e, data) {
  if(data.status == 'success'){
    showSuccessFlash(data);
  }else{
    showErrorFlash(data);
  }
});

解释:

使用remote: true,您的页面将等待ajax答案,您可以听到ajax:success(或其他绑定)。

然后,它会收到json并存储在data变量中。因此,您将获得data.statusdata.message,您可以将其作为反馈显示给您的用户。

有关remote: true http://edgeguides.rubyonrails.org/working_with_javascript_in_rails.html#form-for

的更多信息

有关JS回调https://github.com/rails/jquery-ujs/wiki/ajax

的更多信息

答案 1 :(得分:0)

您可以使用像Gon这样的gem来监视变量并自动为您处理所有Ajax。

设置起来非常简单,您可以让它在您选择的任何时间间隔内执行更新。如果您只是简单地传输变量,这将为您节省一些Ajax编码。并且它会在没有任何重定向的情况下更新您的页面,因此它完全符合您的需求。

答案 2 :(得分:0)

然而,我想出解决这个问题的另一个调整是有/无重定向正在使用application helper制作您的Flash Global并在您选择的任何视图上使用。

将您的Flash消息移至Partials,例如

<强>共享/ _flash_messages.html.erb

    <div class="text-center">
      <% flash.each do |name, msg| %>
          <%= content_tag :div, msg, class: 'alert alert-info' %>
      <% end %>
    </div>

使用完全相同的旧rails方法定义flash消息的自定义帮助方法。这样该方法呈现我们的部分,并且该对象将被解析为您的部分。

<强>助手/ application_helper.rb

module ApplicationHelper
   def flash_messages_for(object)
      render(:partial => 'shared/flash_messages', :locals => {:object => object})
   end
end

在我的视图中,您可以使用erb标记调用它,并在其上调用表单对象,例如<%= flash_messages_for(User.new) %><%= flash_messages_for(@user) %>。请参阅以下代码:

用户/ new.html.erb

<section class="cd-form-wrapper cd-container">
<div class="column panel panel-default">
  <%= flash_messages_for(User.new) %>
  <div class="cd-filter"><h4>SUBSCRIBE FOR JOBS ALERT</h4></div>
  <%= simple_form_for(User.new) do |f| %>
      <%= f.input :email, label: false, :placeholder => 'Enter your email address...', :input_html => { :class => 'newsletter-form-field-styling' } %>
      <%= f.button :submit, 'SUBMIT', :class => 'btn-block newsletter-form-styling btn-primary submit' %>
  <% end %>
</div>

这样,我打开<%= flash_messages_for(User.new) %>的任何视图或表单上的错误消息都会闪现。

你可以参考Lynda.com上的Kevin Skoglund formerrors Ruby on Rails教程Click to watch