2017-02-03 5 views
0

私はほとんど静的なWebサイトをRailsで構築しています。各ページはページコントローラによって管理されます。私は各ページの一番下にコンタクトフォームを持っています。私はmail_formを使用しています。各フォームには新しいContactFormオブジェクトが必要です。私は連絡フォームを定義しました。私はページコントローラのビューのそれぞれでのContactFormオブジェクトの新しいインスタンスを作成できるようにしたいと思い他のコントローラのインスタンス変数 - Rails

class ContactFormsController < ApplicationController 
def new 
    @contact_form = ContactForm.new 
end 

def create 
    begin 
    @contact_form = ContactForm.new(params[:contact_form]) 
    @contact_form.request = request 
    if @contact_form.deliver 
     flash.now[:notice] = 'Thank you for your message!' 
    else 
     render :new 
    end 
    rescue ScriptError 
    flash[:error] = 'Sorry, this message appears to be spam and was not delivered.' 
    end 
end 
end 

:ここ

ActiveRecord::Schema.define(version: 20170130205713) do 

create_table "contact_forms", force: :cascade do |t| 
    t.string "name" 
    t.string "email" 
    t.string "message" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
end 

end 

がコントローラである:これはそれのスキーマです。

NoMethodError in PagesController#home 
undefined method `type' for {:validate=>true}:Hash 

に私の行動のすべてを移動せずにこれを行う方法があります:私はページコントローラのホームビューに

@contact_form = ContactForm.new 

を定義しようとすると、例えば、私はこのエラーを取得しますContactFormコントローラ?

+0

を追加し、エラーがPagesController' 'であるが、あなたは私たちだけ' ContactFormsController'を示しました... – trueinViso

答えて

0

正しく取得している場合は、contact_formのインスタンス変数を持つ必要があります。この変数は、すべてのページの下部に連絡先フォームがあるため、すべてのページで使用できます。

ApplicationControllerでプライベートメソッドを作成し、そのオブジェクトが必要なアクションを持つコントローラであれば、それを 'before_action'として使用できます。

以下のようなものがApplicationController.rb

に線の下に
private 
def init_contact_form 
    @contact_form ||= ContactForm.new 
end 

を追加し、その@contact_formオブジェクトを必要とするコントローラで以下を使用します。 あなたPagesController.rbに以下

before_action :init_contact_form 
関連する問題