Ruby on rails 新的查找视图正在作为新的创建请求进行处理

Ruby on rails 新的查找视图正在作为新的创建请求进行处理,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我之前有一个问题,我正在尝试制作一个ldap搜索表单。 到目前为止,我为用户/查找生成了rails。在这个模型中,我有一个在ldap中搜索用户的功能,它在rails之外独立工作。 但是,通过该视图的请求实际上被视为创建新用户的请求,而不仅仅是在ldap中搜索用户。 我是rails新手,不知道缺少的链接是什么。这里需要一些帮助来理解这一点,在将来,我必须在这个测试应用程序中添加很多类似的功能。我认为这可能会导致同样的问题 # rails generate controller users find

我之前有一个问题,我正在尝试制作一个ldap搜索表单。 到目前为止,我为用户/查找生成了rails。在这个模型中,我有一个在ldap中搜索用户的功能,它在rails之外独立工作。 但是,通过该视图的请求实际上被视为创建新用户的请求,而不仅仅是在ldap中搜索用户。 我是rails新手,不知道缺少的链接是什么。这里需要一些帮助来理解这一点,在将来,我必须在这个测试应用程序中添加很多类似的功能。我认为这可能会导致同样的问题

# rails generate controller users find
错误-

undefined method `gsub' for nil:NilClass
Started GET "/users/find" for 10.85.41.23 at 2012-04-05 19:56:27 -0400
Processing by UsersController#find as HTML
Completed 500 Internal Server Error in 15ms

NoMethodError (undefined method `gsub' for nil:NilClass):
  app/models/user.rb:54:in `FindActiveDirectory'
  app/controllers/users_controller.rb:10:in `find'
模型-

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

您需要另一种方法来处理返回的数据:

控制员:

def find
end

def display_result
  @result = User.findActiveDirectory( params[:user_id] )

  if @result.empty?
    render action: "find", notice: "Could not find a user with id #{params[:user_id]}"
  end
end
下一步是将路由添加到routes.rb:

get 'users/find'
post 'users/display_result'
现在,我们必须更新“查找”的视图:

<h1>Users#find</h1>

<p><%= notice %></p>

<%= form_tag users_display_result_path do %>
  <p>
    <%= label_tag :Username %><br />
    <%= text_field_tag :user_id %>
  </p>
  <p class="button"><%= submit_tag %></p>
<% end %>
您将在控制器/视图中使用一个名为@result的变量。此变量是以属性为键的哈希。因此,您可以在视图中执行以下操作:

<% @result.each do |key,value| %>
  <%= key.to_s.normalize + ": " + value.to_s %>
<% end >


Mhh据我所知,方法应该以一个小写字母开头,因此将名称更改为
findActiveDirectory
。你能发布你的整个用户模型吗?错误发生在用户模型的第54行-但是你只发布了50行…@klump-我编辑了我的代码以添加完整的用户模型。行号可能不准确,因为我在这里试图删除空白行/注释行。@klump-
app/models/user.rb:54:in
FindActiveDirectory'`这里的错误行是54,即
conn.search(:base=>base,:filter=>Net::LDAP::filter.eq(“sAMAccountName”,login),对于
app/controllers/users\u controller.rb:10:in
find'`is
@user=user.FindActiveDirectory(参数[:user\u id])
。你是否通过url将
用户id
传递给控制器?如果你这样做,你的url是什么样子的?你能在
config/routes.rb
文件中发布条目吗?@klump-我以/users/find的身份直接在url中访问它。它会显示一个文本字段和一个提交按钮的小html表单。我的路由显示为-`users\find GET/users/查找(:格式)用户#查找`
get 'users/find'
post 'users/display_result'
<h1>Users#find</h1>

<p><%= notice %></p>

<%= form_tag users_display_result_path do %>
  <p>
    <%= label_tag :Username %><br />
    <%= text_field_tag :user_id %>
  </p>
  <p class="button"><%= submit_tag %></p>
<% end %>
<h1>Users#display_result</h1>
<%= debug @result %>
def self.FindActiveDirectory(login)
  conn = Net::LDAP.new :host => SERVER,
                       :port => PORT,
                       :base => BASE,
                       :auth => { :username => 'admin',
                                  :password => 'adminpass',
                                  :method => :simple }

  if  conn.bind
    result = HashWithIndifferentAccess.new

    conn.search( :base => BASE,
                 :filter => Net::LDAP::Filter.eq( "sAMAccountName", login ),
                 :attributes => ['givenName','SN','mail'],
                 :return_result => true
    ) do |entries|

      entries.each do |attribute, value|
        result[attribute] = value
      end
  end

  return result

  rescue Net::LDAP::LdapError => e
    return false
end
<% @result.each do |key,value| %>
  <%= key.to_s.normalize + ": " + value.to_s %>
<% end >