没有匹配的路由:{:action=>"show", :controller=>"user", :id=>nil}。

4
大家好,我有一个问题(帖子的标题)。
Failure/Error: get :create, :user => { :email => 'foo@example.com', :name => 'userexample' }
ActionController::RoutingError:No route matches {:action=>"show", :controller=>"user", :id=>nil}

这是我的UserController
class UserController < ApplicationController

  def new
  end

  def create
    @user = User.new(params[:user])
    @user.save
    redirect_to :action => :show, :id => @user.id
  end

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

这是我的routes.rb文件:

::Application.routes.draw do

  devise_for :users
  root :to => "user#index"
  resources :user
  #match "newuser" => "user#new"
  get "user/new"
  post "user/create"
  get "user/:id" => "user#show"

以下是我的rspec测试

require 'spec/spec_helper'

describe UserController do
  it "create new user" do
    get :create, :user => { :email => 'foo@example.com', :name => 'userexample' }
      flash[:notice] = 'new user was successfully created.'
    end
  end
end
2个回答

5
if @user.save
   redirect_to :action => :show, :id => @user.id
else
 ...
end

更详细地解释一下,即使.save失败,你也会被重定向到show页面,因此你被重定向时@user.id的值是nil。 - Unixmonkey
我放了你推荐的,但现在我遇到这个错误: Failure/Error: get :create, :user => { :email => 'foo@example.com', :name => 'userexample' } ActionView::MissingTemplate: Missing template user/create, application/create with {:handlers=>[:coffee, :haml, :builder, :erb], :locale=>[:en], :formats=>[:html]}. Searched in: - Asantoya
@ArmandoDeJesusSantoya 这是因为在 else 语句中没有任何操作,所以 Rails 尝试查找 create.html.haml(或 .erb,无论哪种)文件进行渲染。如果用户创建失败,您想要发生什么?也许重定向回创建页面?然后在 else 语句中,加入 redirect_to new_user_path - MrDanA

1

大多数Rails应用程序使用此类型的内容块来创建和更新记录。

def create
  @user = User.new(params[:user])

  if @user.save
    redirect_to @user, :notice => "User was created successfully."
  else
    render :new
  end
end

基本上,当运行create操作时,它会创建一个新记录或User模型的新实例。

当调用.save时,它会检查所有验证。如果验证通过,则返回true,否则返回false。

如果返回false,则需要再次渲染:new模板,以便用户有机会修复任何验证错误。

如果返回true,则要重定向到show操作。Rails的一大优点是 它可以自动找出只需传递实例@user即可。


Ryan Bates在使用RSpec测试控制器方面有一个教程。根据他的方法,这是我会如何测试您的控制器。
require 'spec/spec_helper'

describe UserController do

  describe "POST 'create'" do

    it "should redirect to user on successful save" do
      User.any_instance.stub(:valid?) { true }
      post :user
      flash[:notice].should_not be_nil
      assigns(:user).should_not be_a_new_record
      response.should redirect_to(assigns(:user))
    end

    it "should render new template on failed save" do
      User.any_instance.stub(:valid?) { false }
      post :user
      flash[:notice].should be_nil
      assigns(:user).should be_a_new_record
      response.should render_template(:new)
    end

    it "should pass params" do
      User.any_instance.stub(:valid?) { true }
      post :user, :user => { email_address: "baylor@example.com" }
      assigns(:user).email_address.should == "baylor@example.com"
    end
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接