Ruby rails - NilClass:Class 的未定义方法`model_name' [英] Ruby rails - undefined method `model_name' for NilClass:Class

查看:41
本文介绍了Ruby rails - NilClass:Class 的未定义方法`model_name'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试制作一个小的搜索表单来搜索 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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆