设计Omniauth未定义的方法omniauth_authorize_path

时间:2013-09-25 11:42:25

标签: devise omniauth ruby-on-rails-3.2

我注意到在登录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 个答案:

答案 0 :(得分:14)

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

我遇到了这个错误,因为我按照omniauth自述文件的说明在config/initializers/omniauth.rb设置了我的Facebook帐户。

但是我们需要通过设计来设置它,即在omniauth部分设置config/initializers/devise.rb

答案 1 :(得分:10)

我今天(2016年7月27日)开始收到此错误,当时我升级到Ruby 2.3.1和Rails 4.2.7。对我有用的解决方案是将user_omniauth_authorize_path(:twitter)的所有实例更改为user_twitter_omniauth_authorize_path

答案 2 :(得分:4)

尝试

user_omniauth_authorize_path(provider)

我假设您有一个User类,并且在您的路径文件中有

devise_for :users

答案 3 :(得分:1)

这样做

<%- 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是用户,提供者是facebook,那么它将生成路径:

  

user_facebook_omniauth_authorize_path

如果devise_for是管理员和提供者twitter,那么它将生成路径:

  

admin_twitter_omniauth_authorize_path

答案 4 :(得分:0)

Devise将网址助手更改为omniauth_authorize_path(<scope>, <provider>)

见这里: http://www.rubydoc.info/github/plataformatec/devise/Devise%2FOmniAuth%2FUrlHelpers%3Aomniauth_authorize_path

答案 5 :(得分:0)

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

变化

omniauth_authorize_path

user_omniauth_authorize_path(provider)

答案 6 :(得分:0)

如果您在config/initializers/omniauth.rb中初始化设备提供者,则应在Devise::OmniAuth::UrlHelpersconfig/initializers/omniauth.rb中加入config/initializers/devise.rb