0

これについて以前に質問がありました.ldap検索フォームを作成しようとしています。これまでのところ、ユーザー/検索用にレールを生成しました。モデルには、LDAP でユーザーを検索する機能があります。これは、レールの外で独立して正常に動作します。しかし、このビューを介したリクエストは、実際には LDAP でユーザーを検索するのではなく、新しいユーザーを作成するリクエストとして扱われます。私はレールを初めて使用します。ミッシングリンクが何であるかはわかりません。これを理解するためにここで助けが必要です。将来、このテストアプリに追加しなければならないこのような機能/機能がたくさんあるでしょう。おそらく同じ問題につながると思います。

# 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

コントローラー -

class UsersController < ApplicationController


  def new
        @user = User.new
  end


  def find
   @user = User.FindActiveDirectory(params[:user_id])
  end

  def create
        @user = User.new(params[:user_id])
        if @user.save
                redirect_to users_added_url, :notice => "Signed up!"
        else
                render "new"
        end
  end

end

意見 -

<h1>Users#find</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 class="button"><%= f.submit %></p>
<% end %>

ルート -

rubyapp::Application.routes.draw do

  get "users/find"

get "myapp/new"

root :to => "sessions#new"
#root :to => "home#index"
get "sessions/new"
get "users/new"
get "users/added" => "users#added"
get "myapp" => "myapp#new"
get "log_out" => "sessions#destroy", :as => "log_out"
get "log_in" => "sessions#new", :as => "log_in"
get "sign_up" => "users#new", :as => "sign_up"

resources :users
resources :sessions
 end
4

1 に答える 1

1

返されたデータを処理するには、別の方法が必要です。

コントローラー:

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'

ここで、find のビューを更新する必要があります。

<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 と呼ばれる変数を使用して、コントローラー/ビューに行き着きます。この変数は、属性をキーとするハッシュです。したがって、ビューで次のようなことができます。

<% @result.each do |key,value| %>
  <%= key.to_s.normalize + ": " + value.to_s %>
<% end >
于 2012-04-06T06:38:53.917 に答える