Rails在其他控制器中呈现联系表单

时间:2013-02-18 20:24:53

标签: ruby-on-rails-3 render contact-form

我有两个控制器页面和联系人。页面显示数据库中的内容。联系方式是简单的联系方式,效果很好。现在我想将此联系表单放在特定页面中。但是我尝试渲染这个并且仍然像没有模型类等那样出错。

这是我的Contact控制器(controllers / contact_controller):

class ContactController < ApplicationController

  def new
      @message = Message.new
    end

  def create
      @message = Message.new(params[:message])

      if @message.valid?
        NotificationMailer.new_message(@message).deliver
        redirect_to(root_path, :notice => "Sent.")
      else
        flash.now.alert = "Alert."
        render :new
      end
  end

end

这是我的消息模型(models / message.rb):

class Message

  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :name, :email, :subject, :body

  validates :name, :email, :subject, :body, :presence => true
  validates :email, :format => { :with => %r{.+@.+\..+} }, :allow_blank => true

  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end

  def persisted?
    false
  end

end

这是表格(views / contact / new.html.erb):

<%= form_for @message, :url => contact_path do |form| %>
  <fieldset class="fields">
    <div class="field">
      <%= form.label :name %>
      <%= form.text_field :name %>
    </div>

    <div class="field">
      <%= form.label :email %>
      <%= form.text_field :email %>
    </div>
    <div class="field">
      <%= form.label :subject %>
      <%= form.text_field :subject %>
    </div>

    <div class="field">
      <%= form.label :body %>
      <%= form.text_area :body %>
    </div>
  </fieldset>

  <fieldset class="actions">
    <%= form.submit "Send" %>
  </fieldset>
<% end %>

如何将此表单放到页面查看???

1 个答案:

答案 0 :(得分:0)

我认为你应该使用偏见。例如,您可以将表单放在名为“app / views / shared / _message_form.html.erb”的文件中,然后放入contact / new(和所有其他页面)中,而不是将表单置于contact / new中。 render 'shared/message_form'

显然,你必须在每个控制器中设置@message哪个视图呈现这个部分。也许你可以在你的ApplicationController中有一个方法,如set_message,并在需要时调用它 简单示例:

class ApplicationController < ActionController::Base
  protect_from_forgery

  def set_message
    @message = Message.new params[:message] || {}
  end
end

然后你可以在任何控制器中使用set_message:)