Rails,单页联系表单
Rails, contact form in a one-page
我正在尝试使用 mail_form 在单页网页中放置联系表单。但是,我发现很难按照说明进行操作,因为他们假设我有一个专门针对表单的视图,但在我的例子中,一切都在控制器 visitors_controller 中。
根据说明,控制器应该是这样的:
class ContactsController < ApplicationController
def new
@contact = Contact.new
end
def create
@contact = Contact.new(params[:contact])
@contact.request = request
if @contact.deliver
flash.now[:notice] = 'Thank you for your message. We will contact you soon!'
else
flash.now[:error] = 'Cannot send message.'
render :new
end
end
end
视图将如下所示:
<%= simple_form_for @contact, html: {class: 'form-horizontal' } do |f| %>
<%= f.input :name, :required => true %>
<%= f.input :email, :required => true %>
<%= f.input :message, :as => :text, :required => true %>
<div class= "hidden">
<%= f.input :nickname, :hint => 'Leave this field blank!' %>
</div>
<%= f.button :submit, 'Send message', :class=> "btn btn-primary" %>
<% end %>
如何在我的 visitors_controller 和视图中实现同样的效果?
控制器目前看起来像这样如果它很重要
class VisitorsController < ApplicationController
def index
end
end
归根结底,它只是一种形式,没什么特别的。您只需要告诉表单 POST 到哪里,并在目标中处理它。默认情况下,它会 post 到一个单独的控制器,但这不是必需的,只是最简单的。
到其他地方的 post,它的工作方式与 post 到特定 URL 的任何其他形式一样。
首先,您需要制作URL。
config/routes.rb:
resources :visitors do
post :contact, on: :collection
end
这将向您的应用程序添加路由 contact_visitors_path
。这是您的表单将 POST.
的目标
然后,在visitors_controller中添加对该路由的支持:
def contact
@contact = Contact.new(params[:contact])
@contact.request = request
if @contact.deliver
flash.now[:notice] = 'Thank you for your message. We will contact you soon!'
redirect_to visitors_path # Go back to the index page
else
flash.now[:error] = 'Cannot send message.'
render :index # Instead of :new, as we submit from :index
end
end
接下来,在索引页(表单出现的页面,如示例中的"new")添加对该表单的支持:
def index
@contact = Contact.new
end
最后,只需要告诉表格去哪里post。
= simple_form_for @contact, url: contact_visitors_path, html: {class: 'form-horizontal' }
现在,表单指向您的 visitors_controller
,并由您的自定义方法处理。其他一切都一样。
我正在尝试使用 mail_form 在单页网页中放置联系表单。但是,我发现很难按照说明进行操作,因为他们假设我有一个专门针对表单的视图,但在我的例子中,一切都在控制器 visitors_controller 中。 根据说明,控制器应该是这样的:
class ContactsController < ApplicationController
def new
@contact = Contact.new
end
def create
@contact = Contact.new(params[:contact])
@contact.request = request
if @contact.deliver
flash.now[:notice] = 'Thank you for your message. We will contact you soon!'
else
flash.now[:error] = 'Cannot send message.'
render :new
end
end
end
视图将如下所示:
<%= simple_form_for @contact, html: {class: 'form-horizontal' } do |f| %>
<%= f.input :name, :required => true %>
<%= f.input :email, :required => true %>
<%= f.input :message, :as => :text, :required => true %>
<div class= "hidden">
<%= f.input :nickname, :hint => 'Leave this field blank!' %>
</div>
<%= f.button :submit, 'Send message', :class=> "btn btn-primary" %>
<% end %>
如何在我的 visitors_controller 和视图中实现同样的效果? 控制器目前看起来像这样如果它很重要
class VisitorsController < ApplicationController
def index
end
end
归根结底,它只是一种形式,没什么特别的。您只需要告诉表单 POST 到哪里,并在目标中处理它。默认情况下,它会 post 到一个单独的控制器,但这不是必需的,只是最简单的。
到其他地方的 post,它的工作方式与 post 到特定 URL 的任何其他形式一样。
首先,您需要制作URL。
config/routes.rb:
resources :visitors do
post :contact, on: :collection
end
这将向您的应用程序添加路由 contact_visitors_path
。这是您的表单将 POST.
然后,在visitors_controller中添加对该路由的支持:
def contact
@contact = Contact.new(params[:contact])
@contact.request = request
if @contact.deliver
flash.now[:notice] = 'Thank you for your message. We will contact you soon!'
redirect_to visitors_path # Go back to the index page
else
flash.now[:error] = 'Cannot send message.'
render :index # Instead of :new, as we submit from :index
end
end
接下来,在索引页(表单出现的页面,如示例中的"new")添加对该表单的支持:
def index
@contact = Contact.new
end
最后,只需要告诉表格去哪里post。
= simple_form_for @contact, url: contact_visitors_path, html: {class: 'form-horizontal' }
现在,表单指向您的 visitors_controller
,并由您的自定义方法处理。其他一切都一样。