在一个视图中使用两个控制器

时间:2015-04-26 22:30:43

标签: ruby-on-rails ruby ruby-on-rails-4 model-view-controller

我在简单的网站上使用ruby on rails制作联系表单。问题如下。我有主控制器StaticPages,使用页眉和页脚制作简单的html。现在我创建了控制器Contacts,它在单独的URL上显示简单联系表单的视图。当我尝试将此表单添加到StaticPages的联系页面时,它不起作用。我不知道如何告诉rails这个表单不应该从StaticPages控制器而是从Contacts控制器找到方法。

这是我的代码:

联系人控制器

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] = 'Thanks!'
    else
      flash.now[:error] = 'Error!'
      render :new
    end
  end
end

StaticPages控制器

class StaticPagesController < ApplicationController

  def home
  end

  def about_us
  end

  def contact_us
  end

end

这是我需要处理StaticPage contact_us

的表单
<div align="center">
  <h3>Send us message</h3>

  <%= 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>
    <div>
      </br>
      <%= f.button :submit, 'Send', :class=> "btn btn-primary" %>
    </div>
  <% end %>
</div>

我想我需要告诉rails这个表单应该寻找特定的控制器,但我不知道如何。

请帮忙。

2 个答案:

答案 0 :(得分:1)

这不是你想要的,但它应该按你想要的方式工作,你应该有一个contacts_helper.rb,看起来应该是这样的

module ContactsHelper
  def contact_us
    @contact = Contact.new
  end
end

在你的偏见中,你想要

<%= simple_form_for contact_us, :html => {:class => 'form-horizontal' } do |f| %>

最后,您需要在application_controller.rb

中加入您的助手
class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  ...
  include ContactsHelper
  ...
end

答案 1 :(得分:0)

一个简单的选择是StaticPages contact_us操作redirect_to new_contact_url(假设表单位于app/views/contacts/new.html.erb

或者,您可以将表单放在app/views/shared/_new_contact.html.erb中,然后将@contact = Contact.new放入contact_us操作中,并使用contact_us模板render partial: "shared/new_contact", locals: { :contact => @contact }。< / p>