如果电子邮件未被保存,而不使用重定向,我想闪现通知/错误。我正在为项目使用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消息显示在我的订阅表单上?
答案 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.status
和data.message
,您可以将其作为反馈显示给您的用户。
有关remote: true
http://edgeguides.rubyonrails.org/working_with_javascript_in_rails.html#form-for
答案 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