Rspec用户控制器 - NoMethodError:未定义的方法'user_url'

时间:2013-11-25 07:31:54

标签: ruby-on-rails ruby ruby-on-rails-3 rspec

我现在正在为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到底在哪里。所以我想得到你的帮助。

2 个答案:

答案 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