1

PagesとContactの2つのコントローラーがあります。Pagesはデータベースからのものを表示します。連絡先は簡単な連絡フォームで、うまく機能します。今、私はこのお問い合わせフォームを特定のページに置きたいと思います。しかし、これをレンダリングしようとすると、モデルクラスがないなどのエラーが発生します。

これは私の連絡先コントローラー(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 %>

このフォームをページビューに配置する方法???

4

1 に答える 1

0

パーシャルを使うべきだと思います。フォームをcontact/newに配置する代わりに、たとえば、「app / views / shared / _message_form.html.erb」というファイルに配置してから、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どんなコントローラーでも使うことができます:)

于 2013-02-18T20:46:02.150 に答える