如何在主页面添加Devise的Google授权按钮?
在Rails主页面添加Devise Google OAuth授权按钮的解决方法
你遇到的问题是因为Devise的shared/_links模板依赖认证页面才有的局部变量(比如resource_class),主页面默认没有这些变量,所以直接引用会报错。下面给你几个可行的解决办法:
方法一:直接使用完整的OAuth路由助手
最简单的方式是跳过Devise的局部变量,直接用OmniAuth生成的路由路径。
- 先在终端执行
rails routes | grep google,确认你的Google OAuth路由助手名称,比如如果用的是User模型,一般是user_google_oauth2_omniauth_authorize_path。 - 在主页面视图里直接写按钮代码:
这样不需要依赖任何Devise局部变量,直接跳转到授权页面。<a href="<%= user_google_oauth2_omniauth_authorize_path %>" class="btn btn-primary"> 用Google账号登录 </a>
方法二:在主页控制器传递所需变量
如果想复用shared/_links里的代码,可以在主页的控制器中定义Devise需要的变量:
- 打开主页对应的控制器(比如
app/controllers/home_controller.rb),在index方法里添加:def index @resource_class = User # 替换成你的Devise模型,比如User @resource_name = :user end - 然后在主页面视图里渲染
shared/_links时传递这些变量:
这样模板就能正常调用<%= render "shared/links", resource_class: @resource_class, resource_name: @resource_name %>resource_class等变量了。
额外检查(确保授权功能本身正常)
虽然你说认证功能已经运行,但还是确认下OmniAuth的基础配置:
- Gemfile里有没有
gem 'omniauth-google-oauth2',并且执行过bundle install config/initializers/devise.rb里是否配置了Google的客户端ID和密钥:config.omniauth :google_oauth2, ENV['GOOGLE_CLIENT_ID'], ENV['GOOGLE_CLIENT_SECRET']- 你的用户模型(比如
User)里是否加了devise :omniauthable, omniauth_providers: [:google_oauth2]
内容的提问来源于stack exchange,提问作者Taras Rogulya
相关产品推荐
相关产品推荐

