1

シンプルなログイン/ログアウトリンクを作成しようとしていますが、ボタンにログインまたはログアウトをさせることができるようです...ユーザーがログインしているかログアウトしているかを切り替えることができません。

まず、アプリケーション コントローラーのコードを次に示します。

def current_user
  begin
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  rescue Exception => e
    nil
  end
end

def user_signed_in?
  return true if current_user
end

だから私のログイン/ログアウトのために私はこれを置きます:

<% if @current_user %>
<%= link_to("Logout", destroy_user_session_path, :method => :delete) %>
<% else %>
<%= link_to 'Login', new_user_session_path %>

「@current_user=true」を入力すると、ユーザーがログインしているかどうかに関係なく、常に「ログアウト」が返されます。「@current_user」だけを入力すると、関係なく常にログインが返されます。では、私がやろうとしていることを実際に実行するには、何を入れればよいのでしょうか?

更新OK。問題を引き起こしているのは間違いなく私の OmniAuth 設定です。Facebookでログインすると、ログインログアウトは問題なく機能します。これはおそらく、アクティブな管理者がメールアドレスを表示しなくなったという私が投稿した他の問題に関連しています...しかし、Facebook管理者がログインしている場合、代わりにFacebookユーザー名が表示されます. 関連情報は次のとおりです。

app/models/user.rb から

def self.create_with_omniauth(auth)
create! do |user|
  user.provider = auth['provider']
  user.uid = auth['uid']
  user.password = user.password_confirmation = SecureRandom.urlsafe_base64(n=6)
  if auth['info']
     user.name = auth['info']['name'] || ""
     user.email = auth['info']['email'] || ""

application_controller.rb から

def authenticate_active_admin_user!
authenticate_user!
unless current_user.superadmin?
  redirect_to root_url, :alert => "Access denied."
end
end

def current_user
  begin
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  rescue Exception => e
    nil
  end
end

def user_signed_in?
  return true if current_user
end

def correct_user?
  @user = User.find(params[:id])
  unless current_user == @user
    redirect_to root_url, :alert => "Access denied."
  end
end

def authenticate_user!
  if !current_user
    redirect_to root_url, :alert => 'You need to sign in for access to this page.'
  end

そして最後に、これは Facebook でログインしたときにダバガーが返したものです (Facebook 以外のユーザーの場合は "--" が返されました)。

!ruby/object:User
attributes:
id: 5
email: courtneyloveless@notevenreal.com
encrypted_password: $10$rMOun/NhxPuMyVEIMeFOGSTw4IVmXGTz/qZ9tS63edevML6
reset_password_token: 
reset_password_sent_at: 
remember_created_at: 
sign_in_count: 0
current_sign_in_at: 
last_sign_in_at: 
current_sign_in_ip: 
last_sign_in_ip: 
created_at: 2013-07-05 05:50:01.280117000 Z
updated_at: 2013-07-08 09:46:32.585278000 Z
superadmin: true
provider: facebook
uid: '6786173'
name: MoneyMark

うまくいけば、これがこの問題の根底に到達するのに十分な情報です...基本的に、Facebookユーザーは「current_user」であると言っているだけです。(それでも、どういうわけか、他のユーザーのログインは問題なく機能しています...ただし、それらのユーザーのログインログアウトを行うことはできません。)

4

3 に答える 3

0

@current_user がゼロのようです。そのため、常に他の部分が返されます。if ステートメントの前にデバッガーを作成し、@current_user が値を保持しているかどうかを確認します。次に何をするかを決めるのに役立ちます..

于 2013-07-08T05:15:15.777 に答える