Ruby rails - NilClass:Class 的未定义方法`model_name' [英] Ruby rails - undefined method `model_name' for NilClass:Class
问题描述
我正在尝试制作一个小的搜索表单来搜索 ldap 中的用户.它与本地数据模型没有任何关系.不知道为什么我需要对用户控制器进行任何更改.该错误没有给我任何线索.
模型 - 在 ldap 中搜索的函数
class User :创造validates_uniqueness_of :user_id, :email角色 = ['管理员','用户']####################服务器 = '10.10.10.1'端口 = 389BASE = 'DC=用户,DC=我的站点,DC=com'域 = 'ldap.mysite.com'####################def self.ActiveDirectoryAuthenticate(登录,通过)用户 = find_by_user_id(登录)如果用户零别的返回假结尾conn = Net::LDAP.new :host =>服务器,:端口 =>港口,:基地=>根据,:auth =>{:用户名=>"#{登录}@#{域}",:密码 =>经过,:方法 =>:简单的 }if conn.bind返回用户别的返回假结尾救援网络::LDAP::LdapError =>电子返回假结尾def self.findActiveDirectory(登录)conn = Net::LDAP.new :host =>服务器,:端口 =>港口,:基础 =>根据,:auth =>{:用户名=>'行政',:密码 =>'管理员通行证',:方法 =>:简单的 }if conn.bindconn.search(:base => BASE, :filter => Net::LDAP::Filter.eq("sAMAccountName", 登录),:属性 =>['givenName','SN','mail'], :return_result =>真) 做 |输入|entry.each do |属性,值|if "#{attributes}" == "sn"values.each do |value|puts "Lastname: "+"#{value}"$lastname = "#{value}"结尾结尾if "#{attributes}" == "givenname"values.each do |value|puts "名字:"+"#{value}"$firstname = "#{value}"结尾结尾if "#{attributes}" == "mail"values.each do |value|puts "Email: "+"#{value}"$email = "#{value}"结尾结尾结尾结尾返回真别的返回假结尾救援网络::LDAP::LdapError =>电子返回假结尾结尾
用户控制器 -
class UsersController <应用控制器定义新@user = User.new结尾定义创建@user = User.new(params[:user])如果@user.saveredirect_to users_ added_url, :notice =>注册!"别的呈现新"结尾结尾结尾
查看 - 不起作用 (app/views/users/find.html.erb)
查找用户
<%= form_for @user do |f|%><% if @user.errors.any?%><div class="error_messages"><h2>表单无效</h2><ul><% for message in @user.errors.full_messages %><li><%=消息%></li><%结束%>
<%结束%><p><%= f.label :用户名%><br/><%= f.text_field :用户名 %></p><p class="button"><%= f.submit %></p><%结束%>
查看 - 正在工作 (app/views/users/new.html.erb)
添加新用户
<%= form_for @user do |f|%><% if @user.errors.any?%><div class="error_messages"><h2>表单无效</h2><ul><% for message in @user.errors.full_messages %><li><%=消息%></li><%结束%>
<%结束%><p><%= f.label :用户名%><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 =>假%></p><p class="button"><%= f.submit %></p><%结束%>
路线 -
# rake 路由myapp_new GET/myapp/new(.:format) myapp#new根/家#indexsession_new GET/sessions/new(.:format) 会话#newusers_new GET/users/new(.:format) users#newusers_ added GET/users/added(.:format) users# addedmyapp GET/myapp(.:format) myapp#newlog_out GET/log_out(.:format) 会话#destroy登录 GET/log_in(.:format) 会话#newsign_up GET/sign_up(.:format) users#newusers_find GET/users/find(.:format) users#find根/用户#newusers GET/users(.:format) users#indexPOST/users(.:format) users#createnew_user GET/users/new(.:format) users#newedit_user GET/users/:id/edit(.:format) users#edituser GET/users/:id(.:format) users#showPUT/users/:id(.:format) users#update删除/users/:id(.:format) users#destroy会话 GET/sessions(.:format) 会话#indexPOST/sessions(.:format) 会话#createnew_session GET/sessions/new(.:format) 会话#newedit_session GET/sessions/:id/edit(.:format) 会话#editsession GET/sessions/:id(.:format) session#showPUT/sessions/:id(.:format) session#update删除/sessions/:id(.:format) 会话#destroy
错误 -
NilClass:Class 的未定义方法 `model_name'
问题是您在视图中使用了 @user
,但是 @user
没有定义因此nil
.这就是您收到此错误的原因:
NilClass:Class 的未定义方法 `model_name'
要解决这个问题,您必须将以下内容添加到您的控制器中:
def 查找@user = User.new结尾
或者像这样改变你的观点:
<%= form_for User.new do |f|%>
这将消除您遇到的错误,但提交此表单将发布到您的创建操作,这不是您想要的.对于搜索,您最好使用 form_tag代码>
.查看Rails 指南了解表单基础知识.基本上 form_for
用于创建和更新数据,不适用于搜索.
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.
Model - function to search in 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)
<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)
<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
The problem is that you are using @user
in your view, but @user
is defined nowhere and thus nil
. That's why you get this error:
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 Guides for form basics. Basically form_for
is for creating and updating data, which does not apply to searching.
这篇关于Ruby rails - NilClass:Class 的未定义方法`model_name'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!