【问题标题】:Rails 3 routing error, User class with Devise::OmniauthCallbacksControllerRails 3 路由错误,带有 Devise::OmniauthCallbacksController 的用户类
【发布时间】:2013-02-17 13:19:25
【问题描述】:

我正在尝试为我的用户创建个人资料页面,但由于路由错误,我在用户登录后就卡住了。即使我尝试加载第一页,我也会再次遇到同样的问题。当我执行 rake 路由时,我会得到这些用户路径:

new_user_session GET    /users/sign_in(.:format)               devise/sessions#new
            user_session POST   /users/sign_in(.:format)               devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)              devise/sessions#destroy
 user_omniauth_authorize        /users/auth/:provider(.:format)        users/omniauth_callbacks#passthru {:provider=>/facebook|twitter/}
  user_omniauth_callback        /users/auth/:action/callback(.:format) users/omniauth_callbacks#(?-mix:facebook|twitter)
           user_password POST   /users/password(.:format)              devise/passwords#create
       new_user_password GET    /users/password/new(.:format)          devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format)         devise/passwords#edit
                         PUT    /users/password(.:format)              devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)                devise/registrations#cancel
       user_registration POST   /users(.:format)                       devise/registrations#create
   new_user_registration GET    /users/sign_up(.:format)               devise/registrations#new
  edit_user_registration GET    /users/edit(.:format)                  devise/registrations#edit
                         PUT    /users(.:format)                       devise/registrations#update
                         DELETE /users(.:format)                       devise/registrations#destroy

users GET    /users(.:format)                       users#index
                         POST   /users(.:format)                       users#create
                new_user GET    /users/new(.:format)                   users#new
               edit_user GET    /users/:id/edit(.:format)              users#edit
                    user GET    /users/:id(.:format)                   users#show
                         PUT    /users/:id(.:format)                   users#update
                         DELETE /users/:id(.:format)                   users#destroy

这就是我的 Users::OmniauthCallbacksController 的样子:

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def facebook
    @user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)
    if @user.persisted?
      sign_in_and_redirect @user, :event => :authentication
      set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format?
    else
      session["devise.facebook_data"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end
end

对此我不确定,但我认为我应该创建一个 UsersController,我可以在其中实现设备外部的方法。这是它的样子:

class UsersController < ApplicationController

    def index
        @users = User.all

        respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @ingredients }
    end
    end

    def profile
        @user = current_user

        respond_to do |format|
      format.html 
      format.json { render json: @ingredients }
    end
    end

    def show
        @user = User.find(params[:id])

        respond_to do |format|
      format.html 
      format.json { render json: @ingredients }
    end
    end

end

在我的 routes.rb 中,我有以下用户相关行:

devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" }
resources :users

现在,如果我在用户登录时加载第一页,我会收到错误:

Routing Error

No route matches {:action=>"show", :controller=>"users"}"

有什么想法吗?

【问题讨论】:

  • 你的服务器重启了吗?
  • 嗯...好吧,我还没有清除服务器缓存,但是是的,我已经重新启动了它。

标签: ruby-on-rails devise routing


【解决方案1】:

以下是使用 Devise 和自定义用户控制器时的示例 routes.rb 文件。我遇到了一些路径冲突的问题,我希望请求发送到我的用户控制器,但他们会改为设计。

我在注册 URL 方面遇到了一些具体问题。您可能必须对遇到问题的 URL 执行类似的操作,或者只需指定自定义用户控制器的最后一行即可。

Railsappname::Application.routes.draw do
  root :to => "home#index"
 
  devise_for :users, :skip => [:sessions, :registrations]
 
  devise_scope :user do
    # make some pretty URLs
    get "login" => "devise/sessions#new", :as => :new_user_session
    post 'login' => 'devise/sessions#create', :as => :user_session
    delete "logout" => "devise/sessions#destroy", :as => :destroy_user_session
    # rewrite the registrations URLs so they don't collide with my custom Users Controller
    get "signup" => "devise/registrations#new", :as => :new_user_registration
    put "update-registration" => "devise/registrations#update", :as => :update_user_registration
    delete "delete-registration" => "devise/registrations#destroy", :as => :delete_user_registration
    get "edit-registration" => "devise/registrations#edit", :as => :edit_user_registration
    get "cancel-registration" => "devise/registrations#cancel", :as => :cancel_user_registration
    post "create-registration" => "devise/registrations#create", :as => :user_registration
  end
 
  resources :users, :controller => "users"
end

【讨论】:

    【解决方案2】:

    “设计用户”和“用户”都试图控制“/用户”路由。解决这个问题的最简单方法是告诉设计使用前缀:

    devise_for :users, 
      :path_prefix => 'auth', 
      :controllers => {
        :omniauth_callbacks => "users/omniauth_callbacks" 
      }
    resources :users
    

    现在设计身份验证将发布到“auth_users”,您的 CRUD 仍将发布到“/users”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-30
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多