【问题标题】:Devise Omniauth undefined method omniauth_authorize_path设计 Omniauth 未定义方法 omniauth_authorize_path
【发布时间】:2013-09-25 11:42:25
【问题描述】:

我注意到登录到 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'

【问题讨论】:

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


    【解决方案1】:

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

    我遇到此错误是因为我按照omniauth 自述文件的说明将我的Facebook 帐户设置为config/initializers/omniauth.rb

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 此处相同,似乎是设计 4.x 中的更改。将设计降级到 3.5.6 为我修复了它。
      【解决方案3】:

      试试

      user_omniauth_authorize_path(provider)
      

      我假设你有一个 User 类并且在你的路由文件中你有

      devise_for :users
      

      【讨论】:

      • 这发生在内置的 /users/sign_in 视图中。
      【解决方案4】:

      这样做

      <%- 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 是管理员和提供者 twitter,那么它将创建路径:

      admin_twitter_omniauth_authorize_path

      【讨论】:

        【解决方案5】:

        Devise 将 url 助手更改为 omniauth_authorize_path(&lt;scope&gt;, &lt;provider&gt;)

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

        【讨论】:

          【解决方案6】:

          如果您在config/initializers/omniauth.rb 中初始化您的设计提供程序,您应该在config/initializers/omniauth.rbconfig/initializers/devise.rb 中包含Devise::OmniAuth::UrlHelpers

          【讨论】:

            【解决方案7】:

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

            改变

            omniauth_authorize_path

            user_omniauth_authorize_path(provider)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-07-10
              相关资源
              最近更新 更多