我现在正在为users_controller.rb
进行Rspec测试。但是,我遇到了错误NoMethodError: undefined method 'user_url'
,如下所示。
FF
Failures:
1) UsersController PUT update user update does not succeed
Failure/Error: put :update, {:id => user.to_param}, valid_session, :user_route => user
NoMethodError:
undefined method `user_url' for #<UsersController:0x52e40e0>
# ./app/controllers/users_controller.rb:21:in `block (2 levels) in update'
# ./app/controllers/users_controller.rb:18:in `update'
# ./spec/controllers/users_controller_spec.rb:64:in `block (3 levels) in <top (required)>'
2) UsersController PUT update user update succeeds
Failure/Error: put :update, {:id => user.to_param}, valid_session, :user_route => user
NoMethodError:
undefined method `user_url' for #<UsersController:0x53bc560>
# ./app/controllers/users_controller.rb:21:in `block (2 levels) in update'
# ./app/controllers/users_controller.rb:18:in `update'
# ./spec/controllers/users_controller_spec.rb:58:in `block (3 levels) in <top (required)>'
Finished in 0.679 seconds
2 examples, 2 failures
Failed examples:
rspec ./spec/controllers/users_controller_spec.rb:61 # UsersController PUT update user update does not succeed
rspec ./spec/controllers/users_controller_spec.rb:56 # UsersController PUT update user update succeeds
Randomized with seed 33412
users_controller.rb
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @user }
end
end
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(params[:id])
respond_to do |format|
if @user.update_attributes(params[:user])
format.html { redirect_to @user, notice: 'User was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "user#edit" }
format.json { render json: @idea.errors, status: :unprocessable_entity }
end
end
end
end
这里也是我的Rspec users_controller_spec.rb
。我做了两个关于“POST更新”的测试。一个是成功更新。另一个是没有更新。 (关于后者,我把存储User.stub(:update_attribute).and_return(false)
我期望“update_attribute”返回“false”,以便进程继续“else”。)
require 'spec_helper'
describe UsersController do
let(:valid_attributes) { {
"email" => "hoge@hogehoge.com",
"password" => "12345678"
} }
def valid_session
{}
end
describe "PUT update" do
it "user update succeeds" do
user = User.create! valid_attributes
put :update, {:id => user.to_param}, valid_session
assigns(:user).should eq(user)
end
it "user update does not succeed" do
user = User.create! valid_attributes
User.stub(:update_attribute).and_return(false)
put :update, {:id => user.to_param}, valid_session
assigns(:user).should eq(user)
response.should render_template("edit")
end
end
end
我不知道要解决这个问题,因为我无法理解user_url
到底在哪里。所以我想得到你的帮助。
答案 0 :(得分:2)
当您使用redirect_to @user
时,rails会将该请求发送给UsersController#show
,但会通过调用user_url(@user)
来执行此操作。如果我不得不猜测,你可能没有定义user_url
的行:
resources :users
在routes.rb文件中。这将自动创建控制器使用user_url
redirect_to @user
或者,您可以在routes.rb文件中自己定义路径,如下所示:
get "/users/show" => "users#show", as: :user
但这并不是'Rails-y'的做法。您可以随时在终端中运行命令rake routes
,以查看您在routes.rb
文件中定义的所有已命名路由。如果user
不存在,那么您需要像我上面提到的那样定义它。
有关命名路线的更多信息:http://guides.rubyonrails.org/routing.html#singular-resources
答案 1 :(得分:1)
如果您正在使用设计,请检查以下方法是否返回任何内容。
def after_sign_in_path_for(resource)
在application_controller.rb
中如果方法没有返回任何内容,您将收到错误:
#
的未定义方法`user_url'我最终还是删除了
stored_location_for(resource)
在after_sign_in_path_for(资源)中,因为它导致无限循环。有关详细信息,请参阅此答案。
rails:3 Devise signup Filter chain halted as :require_no_authentication rendered or redirected