【问题标题】:No route matches {:action=>"show", :controller=>"user", :id=>nil}没有路由匹配 {:action=>"show", :controller=>"user", :id=>nil}
【发布时间】:2012-07-17 16:53:09
【问题描述】:

大家好,我有这个问题(帖子标题)。

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

这是我的路线.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

【问题讨论】:

    标签: ruby-on-rails testing rspec routes


    【解决方案1】:
    if @user.save
       redirect_to :action => :show, :id => @user.id
    else
     ...
    end
    

    【讨论】:

    • 稍微解释一下,即使.save失败,你也会被重定向到show,因此你被重定向了,@user.id的值为nil。
    • 我把你推荐的,但现在我得到这个错误 Failure/Error: get :create, :user => { :email => 'foo@example.com', :name => ' userexample' } ActionView::MissingTemplate: 缺少模板用户/创建,应用程序/使用 {:handlers=>[:coffee, :haml, :builder, :erb], :locale=>[:en], :formats=> 创建[:html]}。搜索:
    • @ArmandoDeJesusSantoya 那是因为在其他方面,什么都没有发生,所以 Rails 试图找到一个 create.html.haml(或 .erb,等等)文件来渲染。如果用户创建失败,您希望发生什么?也许重定向回创建页面?然后在你的 else 中,输入redirect_to new_user_path
    【解决方案2】:

    大多数 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 最酷的地方在于 it can automatically figure that out 只需传递实例 @user


    Ryan Bates 在testing controllers with 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
    

    【讨论】:

      猜你喜欢
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      相关资源
      最近更新 更多