2

LDAP による認証後にユーザーのセッションを管理しようとしています。認証部分は非常にうまく機能しますが、セッション ID を生成できないようです。「true:TrueClass のメソッド 'id' が未定義です」というエラーが表示されます。

モデル -

def self.Authenticate(login, pass)
  user = find_by_user_id(login)
  if user
    user
  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 true
  else
    return false
  end
rescue Net::LDAP::LdapError => e
  return false
end    

コントローラ -

def create
  user = User.Authenticate(params[:user_id], params[:password])

  if user
    session[:user_id] = user.id
    redirect_to theapp_url, :notice => "Logged in!"
  else
    flash.now.alert = "Invalid email or password"
    render "new"
  end
end

意見 -

<%= form_tag sessions_path do %>
  <p>
    <%= label_tag :Username %><br />
    <%= text_field_tag :user_id, params[:user_id] %>
  </p>
  <p>
    <%= label_tag :Password %><br />
    <%= password_field_tag :password %>
  </p>
  <p class="button"><%= submit_tag "Log in" %></p>
<% end %>

エラー -

NoMethodError in SessionsController#create

undefined method `id' for true:TrueClass
Rails.root: /myapp

Application Trace | Framework Trace | Full Trace
app/controllers/sessions_controller.rb:12:in `create'
Request

Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"OmzCrLHR1t/xfIXNcEzy2NCGfVpEKSyI4OZfqpPEFNw=",
 "user_id"=>"admin",
 "password"=>"[FILTERED]",
 "commit"=>"Log in"}
4

1 に答える 1

3

の定義ではUser#Authenticate、trueを返すことができます。コントローラのcreateアクションにはがありますsession[:user_id] = user.idが、この場合userはですtrue。そのため、true:TrueClassに対して未定義のメソッド`id'というエラーメッセージが表示されます。

Authenticateメソッドを変更して常にユーザーを返すようにするか、コントローラーを変更trueしてユーザー値として受け入れるようにします。

于 2012-04-05T00:51:18.940 に答える