我正在尝试在我的Ruby on Rails应用程序上安装联系页面。这似乎很简单,但是在安装了邮件 gems 并使用以下命令创建我的控制器之后:
$ rails generate controller contact_form new create
我导航到我的联系人 URL (/contact_form/new),它说
"无法自动加载常量 ContactFormController,预期 /home/ubuntu/workspace/app/controllers/contact_form_controller.rb to 定义它"
路由和控制器如下:
路线.rb
get 'contact_form/new'
get 'contact_form/create'
resources :contact_forms
contact_form_controller.rb
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
contact_form.rb
class ContactForm < MailForm::Base
attribute :name, :validate => true
attribute :email, :validate => /A([w.%+-]+)@([w-]+.)+([w]{2,})z/i
attribute :message
attribute :nickname, :captcha => true
# Declare the e-mail headers. It accepts anything the mail method
# in ActionMailer accepts.
def headers
{
:subject => "My Contact Form",
:to => "your_email@example.org",
:from => %("#{name}" <#{email}>)
}
end
end
请注意,您的类名为ContactFormsController
,Rails正在寻找ContactFormController
。您需要特别注意 Rails 中的复数。
- 控制器是复数。
- 模型是单一的。
- 在大多数情况下,路由是复数的。
- 类的复数必须始终与文件名匹配。
那么为什么Rails要寻找ContactFormController
呢?由于路由定义不正确:
get 'contact_form/new'
get 'contact_form/create'
get 'contact_forms/new'
是表单创建新资源的正确途径。您不使用 GET 创建资源,因此请摆脱get 'contact_form/create'
.
resources :contact_forms
实际上就是你所需要的。
因此,要修复此错误,您应该:
- 重命名
contact_form_controller.rb
->contact_forms_controller.rb
。 - 更改路由定义。
- 改为请求
/contact_forms/new
。