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
4

2 に答える 2

5
if @user.save
   redirect_to :action => :show, :id => @user.id
else
 ...
end
于 2012-07-18T15:37:52.403 に答える
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アクションにリダイレクトします。レールの優れた点は、インスタンスを渡すだけで自動的にそれを把握できること@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
于 2012-07-18T16:32:15.000 に答える