其他控制器中的实例变量 - Rails

时间:2017-02-03 16:34:40

标签: ruby-on-rails

我有一个用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控制器的情况下执行此操作?

1 个答案:

答案 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