我正在为地址簿创建一个基本应用,并希望将联系人与用户相关联。
我为用户设置了身份验证,现在正在尝试将联系人表与用户关联起来。我有两个单独的控制器,一个用于用户,另一个用于联系人,然后我的计划是通过belongs_to:user和has_many:contacts来关联它们。
我绝对被我一直收到的错误所困扰
undefined method `new' for Contact:Module
据我所知,我已经在我的联系人控制器中正确定义了新的,但由于某种原因我不能让它工作。
我目前有以下代码
路线:
Contact::Application.routes.draw do
get "sessions/new"
get "logout" => "sessions#destroy"
controller :user do
get "signup" => "user#new"
end
resources :users, :controller => 'user'
controller :sessions do
get "login" => "sessions#new"
post "login" => "sessions#create"
delete "logout" => "sessions#destroy"
end
controller :dashboard do
get "home" => "dashboard#home"
end
controller :contact do
get "newcontact" => "contact#new"
end
resources :contacts, :controller => 'contact'
root :to => 'sessions#new'
end
联系控制器
class ContactController < ApplicationController
def new
@contact = Contact.new
end
def create
@contact = Contact.new (params[:contact])
if @contact.save
redirect_to root_url
else
render "contact#new"
end
end
end
联络/新表格
<%= form_for @contact do |f| %>
<% if @contact.errors.any? %>
<div class="error_messages">
<h2>Form is invalid</h2>
<ul>
<% for message in @contact.errors.full_messages %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class = "name-field">
<%= f.text_field :name, :placeholder => "Name" %>
</div>
<div class = "company-field">
<%= f.text_field :company, :placeholder => "Company" %>
</div>
<div class = "email-field">
<%= f.text_field :email, :placeholder => "Email" %>
</div>
<div class = "phone-field">
<%= f.text_field :phone, :placeholder => "Phone" %>
</div>
<div class = "mobile-field">
<%= f.text_field :mobile, :placeholder => "Mobile" %>
</div>
<div class="actions"><%= f.submit "Add Contact" %></div>
</div>
<% end %>
人们可以提供任何帮助来解决此错误的确非常感谢,因为我完全陷入困境!我认为这可能与联系一词的多元化有关,但似乎找不到正确的解决方法。
非常感谢您的帮助! 汤姆
答案 0 :(得分:2)
Rails在application.rb(Contact)中定义的模块与您的模型类(也是Contact)之间变得混乱。您不能在一个地方module Contact
而在另一个地方class Contact
(事实上,因为您处于开发模式,因此存在联系模块意味着rails甚至没有查看您的联系人.rb文件)
你将不得不重命名其中一个。应用程序可能更容易更改 - 只需将Contact::Application
的所有实例替换为(例如)ContactApp::Application
,并将application.rb中的module Contact
更改为模块ContactApp
。你也几乎没有输入应用程序模块的名称,所以它有一个稍微不和谐的名字并不是什么大不了的事。