我有一个用Rails构建的静态网站。每个页面由页面控制器管理。我在每页底部都有一个联系表格。我正在使用mail_form。每个表单都需要一个新的ContactForm对象。我已经定义了联系表格。这是它的架构:
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
这是控制器:
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
我希望能够在每个页面控制器的视图中创建ContactForm对象的新实例。当我尝试定义
时@contact_form = ContactForm.new
例如,在页面控制器的主视图中,我收到此错误:
NoMethodError in PagesController#home
undefined method `type' for {:validate=>true}:Hash
有没有办法在不将所有动作移动到ContactForm控制器的情况下执行此操作?
答案 0 :(得分:0)
如果我正确地告诉你,你需要有一个可以在每个页面中使用的contact_form实例变量,因为每个页面底部都有联系表格。
您可以在ApplicationController中创建一个私有方法,并在任何控制器中将其用作“before_action”,您需要该操作的操作。像下面的东西
在ApplicationController.rb中添加以下行
private
def init_contact_form
@contact_form ||= ContactForm.new
end
并在Controller中使用@contact_form对象。 在PagesController.rb中添加以下内容
before_action :init_contact_form