Rails,联系表单一页

时间:2016-04-28 21:47:53

标签: ruby-on-rails forms contact

我正在尝试使用mail_form将联系表单放在一页的网页中。但是,我发现很难按照说明进行操作,因为他们假设我有专门针对表单的视图,但在我的情况下,所有内容都在控制器 visitor_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 %>

如何在我的visitor_controller和视图中实现相同的功能? 如果重要的话,控制器目前看起来像这样

class VisitorsController < ApplicationController
    def index
    end
end

1 个答案:

答案 0 :(得分:1)

在一天结束时,它只是一种形式,没什么特别的。您只需要告诉表单POST的位置,并在目标中处理它。默认情况下,它会发布到一个单独的控制器,但这不是必需的,只是最简单的。

要在其他地方发布,它就像发布到特定网址的任何其他表单一样。

首先,您需要制作网址。

配置/ routes.rb中:

resources :visitors do
  post :contact, on: :collection
end

这将为您的应用添加路由contact_visitors_path。这是表单POST的目标。

然后,在visitor_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

接下来,在索引页面上添加对此表单的支持(表单显示的页面,例如&#34; new&#34;在示例中):

def index
  @contact = Contact.new
end

最后,只需要告诉表单在哪里发布。

= simple_form_for @contact, url: contact_visitors_path, html: {class: 'form-horizontal' }

现在,表单指向您的visitors_controller,并由您的自定义方法处理。其他一切都是一样的。