Ruby rails - NilClass:Class 的未定义方法`model_name'
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10023353/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Ruby rails - undefined method `model_name' for NilClass:Class
提问by Kapish M
I am trying to make a small search form to search a user in ldap. It doesn't really have anything to do with local data model. Not sure why do I need any changes in the user controller. The error is not giving any clue to me.
我正在尝试制作一个小的搜索表单来搜索 ldap 中的用户。它与本地数据模型没有任何关系。不知道为什么我需要对用户控制器进行任何更改。该错误没有给我任何线索。
Model - function to search in ldap
模型 - 在 ldap 中搜索的函数
class User < ActiveRecord::Base
attr_accessible :user_id, :firstname, :lastname, :email, :role, :misc, :password
validates_presence_of :user_id, :firstname, :lastname, :email, :role, :on => :create
validates_uniqueness_of :user_id, :email
ROLES = ['Admin','User']
####################
SERVER = '10.10.10.1'
PORT = 389
BASE = 'DC=User,DC=mysite,DC=com'
DOMAIN = 'ldap.mysite.com'
####################
def self.ActiveDirectoryAuthenticate(login, pass)
user = find_by_user_id(login)
if user
nil
else
return false
end
conn = Net::LDAP.new :host => SERVER,
:port => PORT,
:base => BASE,
:auth => { :username => "#{login}@#{DOMAIN}",
:password => pass,
:method => :simple }
if conn.bind
return user
else
return false
end
rescue Net::LDAP::LdapError => e
return false
end
def self.findActiveDirectory(login)
conn = Net::LDAP.new :host => SERVER,
:port => PORT,
:base => BASE,
:auth => { :username => 'admin',
:password => 'adminpass',
:method => :simple }
if conn.bind
conn.search(:base => BASE, :filter => Net::LDAP::Filter.eq( "sAMAccountName", login ),
:attributes => ['givenName','SN','mail'], :return_result => true) do |entry|
entry.each do |attributes, values|
if "#{attributes}" == "sn"
values.each do |value|
puts "Lastname: "+"#{value}"
$lastname = "#{value}"
end
end
if "#{attributes}" == "givenname"
values.each do |value|
puts "Firstname: "+"#{value}"
$firstname = "#{value}"
end
end
if "#{attributes}" == "mail"
values.each do |value|
puts "Email: "+"#{value}"
$email = "#{value}"
end
end
end
end
return true
else
return false
end
rescue Net::LDAP::LdapError => e
return false
end
end
User controller -
用户控制器 -
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(params[:user])
if @user.save
redirect_to users_added_url, :notice => "Signed up!"
else
render "new"
end
end
end
View - is NOT working (app/views/users/find.html.erb)
查看 - 不工作(app/views/users/find.html.erb)
<h1>Find User</h1>
<%= form_for @user do |f| %>
<% if @user.errors.any? %>
<div class="error_messages">
<h2>Form is invalid</h2>
<ul>
<% for message in @user.errors.full_messages %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<p>
<%= f.label :Username %><br />
<%= f.text_field :username %>
</p>
<p class="button"><%= f.submit %></p>
<% end %>
View - is working (app/views/users/new.html.erb)
查看 - 正在工作(app/views/users/new.html.erb)
<h1>Add new user</h1>
<%= form_for @user do |f| %>
<% if @user.errors.any? %>
<div class="error_messages">
<h2>Form is invalid</h2>
<ul>
<% for message in @user.errors.full_messages %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<p>
<%= f.label :Username %><br />
<%= f.text_field :user_id %>
</p>
<p>
<%= f.label :Firstname %><br />
<%= f.text_field :firstname %>
</p>
<p>
<%= f.label :Lastname %><br />
<%= f.text_field :lastname %>
</p>
<p>
<%= f.label :Email %><br />
<%= f.text_field :email %>
</p>
<p>
<%= f.label :Role %><br />
<%= f.collection_select :role, User::ROLES, :to_s, :to_s, :include_blank => false %>
</p>
<p class="button"><%= f.submit %></p>
<% end %>
routes -
路线——
# rake routes
myapp_new GET /myapp/new(.:format) myapp#new
root / home#index
sessions_new GET /sessions/new(.:format) sessions#new
users_new GET /users/new(.:format) users#new
users_added GET /users/added(.:format) users#added
myapp GET /myapp(.:format) myapp#new
log_out GET /log_out(.:format) sessions#destroy
log_in GET /log_in(.:format) sessions#new
sign_up GET /sign_up(.:format) users#new
users_find GET /users/find(.:format) users#find
root / users#new
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
sessions GET /sessions(.:format) sessions#index
POST /sessions(.:format) sessions#create
new_session GET /sessions/new(.:format) sessions#new
edit_session GET /sessions/:id/edit(.:format) sessions#edit
session GET /sessions/:id(.:format) sessions#show
PUT /sessions/:id(.:format) sessions#update
DELETE /sessions/:id(.:format) sessions#destroy
Error -
错误 -
undefined method `model_name' for NilClass:Class
回答by Mischa
The problem is that you are using @userin your view, but @useris defined nowhere and thus nil. That's why you get this error:
问题是您@user在视图中使用,但@user没有定义,因此nil. 这就是您收到此错误的原因:
undefined method `model_name' for NilClass:Class
To solve this you have to add the following to your controller:
要解决这个问题,您必须将以下内容添加到您的控制器中:
def find
@user = User.new
end
Or change your view like this:
或者像这样改变你的观点:
<%= form_for User.new do |f| %>
This will get rid of the error you are getting, but submitting this form will post to your create action, which is not what you want. For searching you'd better use form_tag. Check out Rails Guidesfor form basics. Basically form_foris for creating and updating data, which does not apply to searching.
这将消除您遇到的错误,但提交此表单将发布到您的创建操作,这不是您想要的。对于搜索,您最好使用form_tag. 查看Rails 指南了解表单基础知识。基本上form_for是用于创建和更新数据,这并不适用于搜索。

