使用Devise Omniauth时出现“undefined method omniauth_authorize_path”的错误方法。

16

我注意到在登录Devise时,我开始收到这些错误消息。

我正在使用Devise 2.2.4与Omniauth 1.1.4和Omniauth-Facebook 1.4.1

有人知道这个错误的原因吗?

  ActionView::Template::Error (undefined method `omniauth_authorize_path' for #<#<Class:0xb85e534>:0xb904e5c>):
21: <%- if devise_mapping.omniauthable? %>
22:   <%- resource_class.omniauth_providers.each do |provider| %>
23:     <% logger.info "hey #{provider} , dolphin and #{resource_name}" %>
24:     <%= link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider) %><br />
25:   <% end -%>
26: <% end -%>

  app/views/devise/shared/_links.erb:24:in `block in _app_views_devise_shared__links_erb___1039642231_94147460'
  app/views/devise/shared/_links.erb:22:in `each'
  app/views/devise/shared/_links.erb:22:in `_app_views_devise_shared__links_erb___1039642231_94147460'
  app/views/devise/sessions/new.html.erb:17:in `_app_views_devise_sessions_new_html_erb__883448937_92868060'
7个回答

21

可能的一个错误是omniauth配置设置在了错误的位置。

我遇到了这个错误,因为我按照omniauth说明文档中的指示,在config/initializers/omniauth.rb中设置了我的Facebook账户。

然而,我们需要通过devise来设置它,即在omniauth部分中的config/initializers/devise.rb中设置。


11

我从今天开始(2016年7月27日)在升级到Ruby 2.3.1和Rails 4.2.7后遇到了这个错误。对我有效的解决方案是将所有的user_omniauth_authorize_path(:twitter)实例更改为user_twitter_omniauth_authorize_path


2
一样的问题,似乎是在设备4.x上的变化。将设备降级到3.5.6后,问题得到了解决。 - thebenedict

6

尝试

user_omniauth_authorize_path(provider)

我假设你已经有一个User类,并且在你的路由文件中有以下内容:
devise_for :users

这发生在内置的 /users/sign_in 视图中。 - lulalala

3

像这样做

<%- if devise_mapping.omniauthable? %>
  <%- resource_class.omniauth_providers.each do |provider| %>
    <%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", public_send("user_#{provider.to_s}_omniauth_authorize_path") %><br />
  <% end -%>
<% end -%>

这使得它可用于多个供应商,但假定您正在使用。
devise_for :users

但更进一步,您还可以添加

resource_class.name.downcase

涵盖的范围不仅限于用户。

<%- if devise_mapping.omniauthable? %>
  <%- resource_class.omniauth_providers.each do |provider| %>
     <%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", public_send("#{resource_class.name.downcase}_#{provider.to_s}_omniauth_authorize_path") %><br />
  <% end -%>
<% end -%>

如果 devise_for 是 users 而 provider 是 facebook,则它将生成路径:

user_facebook_omniauth_authorize_path

如果 devise_for 是 admins 而 provider 是 twitter,则它将生成路径:

admin_twitter_omniauth_authorize_path


3
如果您在config/initializers/omniauth.rb中初始化您的设备提供者,您应该在config/initializers/omniauth.rbconfig/initializers/devise.rb中包含Devise::OmniAuth::UrlHelpers。请保留HTML标签。

2

1

在你的app/views/devise/shared/_links.erb文件中:

omniauth_authorize_path

改为

user_omniauth_authorize_path(provider)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接