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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-03 03:09:50  来源:igfitidea点击:

Ruby rails - undefined method `model_name' for NilClass:Class

ruby-on-railsrubyruby-on-rails-3

提问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是用于创建和更新数据,这并不适用于搜索。