问题在简短:我在rails 4应用程序(4.1.8)工作,我试图得到flash[:notice]
和flash[:alert]
显示在一个形式下。
两个控制器:landingpage_controller
和contacts_controller
。landingpage_controller
通过其show
动作提供静态登陆页面,contacts_controller
具有new
和create
动作,将联系人存储在db表中。
在静态登陆页面上,带有id="contact-modal"
的模态包含带有simple_form_for @contact的部分(见下文)。在提交表单时,如果字段没有全部填写,则不创建 db-entry;如果字段已填写,则创建 db-entry。
想要输出:
理想情况下,局部将在不离开/关闭模态的情况下重新加载,要么是:一个成功消息和一个空表单,要么是一个警告消息和提交时的表单。我如何做到这一点?
控制器:app/controllers/contacts_controller.rb
class ContactsController < ApplicationController
def new
@contact = Contact.new
render layout: "contact"
end
def create
@contact = Contact.new
respond_to do |format|
if @contact.save
flash[:notice] = "Success"
format.js
else
flash[:alert] = "Error"
format.js
end
end
end
private
def contact_params
params.require(:contact).permit(:email, :structure, :message_content)
end
end
格式:app/views/contacts/_new.html.haml
= simple_form_for @contact, html: { id: "contact-form"} do |c|
= c.input :email
= c.input :structure
= c.input :message_content
= c.button :submit
.messages-container
= if flash[:notice]
%p
= flash[:notice]
= if flash[:alert]
%p
= flash[:alert]
路线:
resources :contacts, only: [:new, :create]
我知道部分重新加载可能涉及AJAX。我已经读了几个关于这个的StackOverflow问题,但还没能弄清楚。请看这里,这里和这两篇博客文章:jetthoughts和ericlondon。
非常感谢您的帮助
你的代码中有几个问题:
- 视图,以下划线开头的被称为部分,不是完整的动作,但只是可重用的视图代码的一部分(你不重定向到他们,而是使用
render
,因为你通常不想要一个完整的页面重新加载。
_new.html.haml
重命名为_form.html.haml
2.1创建一个新的视图new.html.erb
(我猜你已经有了,否则你的new
动作可能无法正常工作)内容= render 'form'
根据我的理解,你不希望模态关闭,只是为了在成功提交或出现错误后呈现表单。
在这种情况下:
1。在views/contacts文件夹中创建一个create.js.erb
文件create.js.erb
$("#your_modal_id").html("<%= j( render 'form') %>")
2。修改create
动作
def create
@contact = Contact.new(contact_params)
respond_to do |format|
if @contact.save
flash[:notice] = "Success"
format.js
else
flash[:alert] = "Error"
format.js
end
end
end
- 添加
remote: true
警告:这将使您的表单继续填写,即使成功。
关于此主题的更多信息请参见:
http://guides.rubyonrails.org/v4.1.8/working_with_javascript_in_rails.html形式
希望有帮助,我希望我没有忘记任何东西