2012-10-22 29 views
0

我試圖添加一個自定義操作到設計的註冊控制器,它允許用戶更改他們的密碼(我不能使用默認registrations#edit,因爲我需要一個窗體來更改只有密碼,而不是電子郵件/用戶名)。我在下面寫的實現工作在開發模式下,但當我測試控制器時出現此錯誤。ActionController :: RoutingError當測試自定義設計控制器

Failure/Error: get 'password' 
ActionController::RoutingError: 
    No route matches {:controller=>"registrations", :action=>"password"} 

有我的代碼(我試圖跳過不相關的部分)

spec/controllers/registrations_controller_spec.rb

describe RegistrationsController do 
    include Devise::TestHelpers 

    before :each do 
    request.env["devise.mapping"] = Devise.mappings[:users] 
    end 

    describe "GET 'password'" do 
    it "..." do 
        # The problem is here, 
     get 'password' # it raises ActionController::RoutingError 
    end 
    end 
end 

app/controllers/registrations_controller.rb

class RegistrationsController < Devise::RegistrationsController 
    # ... 
    def password 
    end 
end 

config/routes.rb

devise_for :users, path: 'account', 
    controllers: { registrations: 'registartions' }, 
    skip: [:registartions, :sessions] 

devise_scope :user do 
    # ... 
    scope '/account' do 
    get 'password' => 'devise/registartions#password', as: "change_password 
    do 
end 

spec_helper.rb

# ... 
RSpec.configure do |config| 
    # ... 
    config.include Devise::TestHelpers, :type => :controller 
end 

回答

1

我通常會爲此添加註釋,但我包含一個代碼塊,它在評論中變得雜亂無章。

看起來好像你正在試圖在/password上執行GET而不是在/account/password上。

從我讀什麼,你已經有了一個映射/account/password

devise_scope :user do # used to remove /users/ part from devise URLs 
    # ... 
    scope '/account' do # adds /account to URLs 
    get 'password' => 'devise/registartions#password', as: "change_password" 
    # this will match /account/passwordAnswer 

    do 
end 

所以,你應利用這個刪除的範圍,或更換您的GET請求中測試:

get "/account/password", :user => @user 

或本

get change_password_path(@user) 

@userUser的模擬。

運行rake routes確認。

1

你有沒有設置你的config/routes.rb中有以下內容。

devise_for :users do 
    get 'logout' => 'devise/sessions#destroy' 
    get 'changepassword' => 'devise/registrations#edit' 
    get 'access' => 'homepages#access' 
    get 'history' => 'policies#history' 
    get 'future' => 'policies#future' 
    end 
    devise_for :users, :controllers => { :sessions => :sessions } 
    resources :users 

我有同樣的問題。我設置了路線,然後它對我有用:)

0

我不喜歡在規範中使用get "/account/password"或路徑。似乎哈克。在devise_for

    1. 使用path: 'account'選項設定明確我的自定義控制器controllers: {registrations: 'registrations'}

    所以我的路線:我固定在我的routes.rb文件使用更好的語法類似的問題。rb看起來像這樣:

    devise_for :users, 
          path: 'account', 
          path_names: {sign_in: 'login', sign_out: 'logout', sign_up: 'register'},     
          controllers: {registrations: 'registrations'}, 
          skip: [:passwords] 
    

    然後我可以在我的測試中使用get :new。更乾淨。

    希望這可以幫助別人。

    我正在使用devise 3.0。

  • 相關問題