0

我正在尝试向 Devise 的注册控制器添加一个自定义操作,该操作允许用户更改他们的密码(我不能使用默认值registrations#edit,因为我需要一个仅更改密码而不是电子邮件/用户名的表单)。我在下面编写的实现在开发模式下工作,但是当我测试控制器时出现此错误。

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
4

3 回答 3

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

我也有同样的问题。我设置了路线,然后它对我有用:)

于 2012-10-22T11:52:23.140 回答
1

我通常会为此添加评论,但我包含了一个代码块,它在评论中变得混乱。

似乎您正在尝试执行 a GETon/password而不是 on /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)

@useraUser的模拟在哪里。

运行rake routes确认。

于 2012-10-22T12:03:21.343 回答
0

我不喜欢get "/account/password"在我的规范中使用或路径。看起来很hacky。我通过在我的 routes.rb 文件中使用更好的语法解决了类似的问题:

  1. 使用path: 'account'选项devise_for
  2. 明确设置我的自定义控制器controllers: {registrations: 'registrations'}

所以我的 routes.rb 看起来像这样:

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

然后我可以get :new在我的测试中使用。干净多了。

希望这对其他人有帮助。

我正在使用设计 3.0。

于 2013-09-05T06:27:56.047 回答