Ruby rails: undefined method `model_name " pour NilClass:Classe
Je suis en train de faire un petit formulaire de recherche pour rechercher un utilisateur dans le ldap. Il n'a pas vraiment rien avoir à faire avec les données locales de modèle. Pas sûr pourquoi ai-je besoin de tout changement dans le contrôleur utilisateur. L'erreur est de ne pas donner la moindre idée de moi.
Modèle de la fonction de recherche dans le 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
De l'utilisateur contrôleur -
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
Affichage ne fonctionne PAS (app/views/users/trouver.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 %>
Vue - est de travail (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
Erreur
undefined method `model_name' for NilClass:Class
- Sur quelle ligne dans votre code, le message d'erreur se produit? D'où appelez-vous FindActiveDirectory?
- Veuillez fournir la trace de l'erreur et les extraits de code à partir de votre application références.
Started GET "/users/find" for 10.110.34.12 at 2012-04-05 03:31:57 -0400 Processing by UsersController#find as HTML Rendered users/find.html.erb within layouts/application (0.6ms) Completed 500 Internal Server Error in 2ms ActionView::Template::Error (undefined method ``model_name' for NilClass:Class): 1: <h1>Find User</h1> 2: 3: <%= form_for @user do |f| %> 4: <% if @user.errors.any? %> 5: <div class="error_messages"> 6: <h2>Form is invalid</h2> app/views/users/find.html.erb:3:in
_app_views_users_find_html_erb__964737868_89494140'
- Je n'ai pas FindActiveDirectory directement n'importe où encore. Honnêtement, n'a pas fini la partie. Je suis coincé avec cette erreur.
- Comment le fichier de vue appelé?
- directement par l'utilisateur /les utilisateurs/trouver
- Vous pouvez poster la vue nom de fichier, l'action et les lignes concernées?
- directement via l'url /users/trouver
# rake routes | grep user users_new GET /users/new(.:format) users#new users_added GET /users/added(.:format) users#added 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
- Avez-vous l'intention d'ajouter
@user = User.new
par l'utilisateur dans le fichier de contrôleur ou quelque part d'autre? Il est déjà là dans de l'utilisateur contrôleur de fichier. - Fondamentalement, je suis en train d'ajouter une nouvelle fonctionnalité de recherche d'un utilisateur dans le ldap sous le standard intégré de vue de l'utilisateur et le contrôleur.
- pourriez-vous ajouter cette information à la question? C'est beaucoup plus lisible que l'ajout d'un commentaire? Avez-vous vu ma réponse? Est-il vous aider?
- Oui, je voulais dire dans le fichier de contrôleur. J'ai essayé d'expliquer un peu plus dans la mise à jour de ma réponse. Il semble que vous êtes très nouveau pour les Rails. Je recommande de regarder la Rails Guides, qui vous apprend beaucoup de Rails de base.
- En outre, il me semble que Mischa est droit donc @utilisateur est jamais définie pour toute valeur à cause des Rails est à l'aide de l' (implicitement défini) "trouver" de l'action, qui ne fait rien par défaut, mais le rendu de la vue. Si vous n'avez pas d'action, puis de l'ajouter, si non, merci de poster son code!
- J'ai édité ma question d'ajouter un peu plus de code, il y a un plus d'afficher les utilisateurs qui fonctionne parfaitement.
- Oui, je suis nouveau sur les rails. 🙂
- merci pour la mise à jour. Ma réponse explique pourquoi vous obtenez le message d'erreur et comment faire pour se débarrasser de lui. Avez-vous essayé? Il ya quelque chose que vous ne comprenez rien à ce sujet? S'il vous plaît laissez-moi savoir.
- merci à vous deux. que résolu! Venu avec une nouvelle question, mais je vais être en mesure de fixer que sur mon propre.
Vous devez vous connecter pour publier un commentaire.
Le problème est que vous utilisez
@user
de votre point de vue, mais@user
est défini nulle part et doncnil
. C'est pourquoi vous obtenez ce message d'erreur:Pour résoudre ce problème, vous devez ajouter les lignes suivantes à votre contrôleur:
Ou changer votre point de vue comme ceci:
Ce va se débarrasser de l'erreur que vous obtenez, mais en soumettant ce formulaire sera publier sur votre action de création, ce qui n'est pas ce que vous voulez. Pour la recherche, vous feriez mieux d'utiliser
form_tag
. Découvrez Rails Guides pour la forme de base. Fondamentalementform_for
est pour la création et la mise à jour des données, qui ne s'applique pas à la recherche.