ROR 未初始化常量 ContatosController::Contato
ROR uninitialized constant ContatosController::Contato
我开始在 ROR 中发展。我现在做的用户历史是一个联系页面。下面列出了 MVC 的代码:
app/controller/contatos_controller.rb
class ContatosController < ApplicationController
def new
@contato = Contato.new
end
def create
@contato = Contato.new(secure_params)
if @contato.valid?
flash[:notice] = "Mensagem enviada de #{@contato.name}."
redirect_to root_path
else
render :new
end
end
private
def secure_params
params.require(:contato).permit(:name, :subject, :email, :content)
end
end
app/models/Contato.rb
class Contato
include ActiveModel::Model
attr_accessor :name, :string
attr_accessor :subject, :string
attr_accessor :email, :string
attr_accessor :content, :string
validates_presence_of :name
validates_presence_of :subject
validates_presence_of :email
validates_presence_of :content
validates_format_of :email,
with: /\A[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}\z/i
validates_length_of :content, :maximum => 500
end
app/views/contatos/new.html.erb
<h3>Contato</h3>
<div class="form">
<%= simple_form_for @contato do |form| %>
<%= form.error_notification %>
<%= form.input :name, autofocus: true %>
<%= form.input :subject %>
<%= form.input :email %>
<%= form.input :content, as: :text %>
<%= form.button :submit, 'Submit', class: 'submit' %>
<% end %>
</div>
config/routes.rb
Rails.application.routes.draw do
resources :contatos, only: [:new, :create]
root 'static_pages#home'
end
当我尝试访问 http://localhost:3000/contatos/new 时,显示以下错误:
NameError in ContatosController#new
uninitialized constant ContatosController::Contato
app/controllers/contatos_controller.rb:4:in `new'
我发现这个错误是与拼写错误有关,但我的情况似乎不是这样。这可能是一个愚蠢的错误,但我找不到它。有人可以帮助我吗?
正如@Robert 在他的评论中指出的那样,您需要以小写形式命名您的 Contato
模型文件。
但是,由于 Ruby 正在控制器本身 (ContatosController::Contato
) 中查找您的模型,您可以通过在模型名称前加上双冒号来解决这个问题,如下所示:
@contato = ::Contato.new
这将强制 Ruby 解释器在 "root/top" 命名范围中寻找 Contato
模型。
我开始在 ROR 中发展。我现在做的用户历史是一个联系页面。下面列出了 MVC 的代码:
app/controller/contatos_controller.rb
class ContatosController < ApplicationController
def new
@contato = Contato.new
end
def create
@contato = Contato.new(secure_params)
if @contato.valid?
flash[:notice] = "Mensagem enviada de #{@contato.name}."
redirect_to root_path
else
render :new
end
end
private
def secure_params
params.require(:contato).permit(:name, :subject, :email, :content)
end
end
app/models/Contato.rb
class Contato
include ActiveModel::Model
attr_accessor :name, :string
attr_accessor :subject, :string
attr_accessor :email, :string
attr_accessor :content, :string
validates_presence_of :name
validates_presence_of :subject
validates_presence_of :email
validates_presence_of :content
validates_format_of :email,
with: /\A[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}\z/i
validates_length_of :content, :maximum => 500
end
app/views/contatos/new.html.erb
<h3>Contato</h3>
<div class="form">
<%= simple_form_for @contato do |form| %>
<%= form.error_notification %>
<%= form.input :name, autofocus: true %>
<%= form.input :subject %>
<%= form.input :email %>
<%= form.input :content, as: :text %>
<%= form.button :submit, 'Submit', class: 'submit' %>
<% end %>
</div>
config/routes.rb
Rails.application.routes.draw do
resources :contatos, only: [:new, :create]
root 'static_pages#home'
end
当我尝试访问 http://localhost:3000/contatos/new 时,显示以下错误:
NameError in ContatosController#new
uninitialized constant ContatosController::Contato
app/controllers/contatos_controller.rb:4:in `new'
我发现这个错误是与拼写错误有关,但我的情况似乎不是这样。这可能是一个愚蠢的错误,但我找不到它。有人可以帮助我吗?
正如@Robert 在他的评论中指出的那样,您需要以小写形式命名您的 Contato
模型文件。
但是,由于 Ruby 正在控制器本身 (ContatosController::Contato
) 中查找您的模型,您可以通过在模型名称前加上双冒号来解决这个问题,如下所示:
@contato = ::Contato.new
这将强制 Ruby 解释器在 "root/top" 命名范围中寻找 Contato
模型。