簡體   English   中英

Michael Hartl Rails教程第7章錯誤在UsersController中找不到操作

[英]Michael Hartl Rails Tutorial chapter 7 error Action not found in UsersController

我現在正在關注邁克爾哈特爾的Rails教程,我已經成功達到7.22而沒有任何重大障礙。 但是我對測試的結果感到困惑,他說:

Failures:

  1) UserPages signup with invalid information should not create a user
     Failure/Error: expect{click_button submit }.not_to change(User, :count)
     AbstractController::ActionNotFound:
       The action 'create' could not be found for UsersController
     # (eval):2:in `click_button'
     # ./spec/requests/user_pages_spec.rb:29:in `block (5 levels) in <top (required)>'
     # ./spec/requests/user_pages_spec.rb:29:in `block (4 levels) in <top (required)>'

  2) UserPages signup with valid information should create a user
     Failure/Error: expect{click_button submit}.to change(User, :count).by(1)
     AbstractController::ActionNotFound:
       The action 'create' could not be found for UsersController
     # (eval):2:in `click_button'
     # ./spec/requests/user_pages_spec.rb:42:in `block (5 levels) in <top (required)>'
     # ./spec/requests/user_pages_spec.rb:42:in `block (4 levels) in <top (required)>'

Finished in 0.7718 seconds
6 examples, 2 failures

我按照教程的指示將以下內容添加到我的用戶控制器頁面:

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

  def new
    @user = User.new
  end

end

但它似乎仍然沒有奏效。 我已經嘗試添加一個創建方法,但這只會丟失一個丟失的模板錯誤...

如果它有幫助,這里是rake routes命令的輸出:

~/dev/rails/sample_app$ rake routes
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy
     root        /                         static_pages#home
   signup        /signup(.:format)         users#new
     help        /help(.:format)           static_pages#help
    about        /about(.:format)          static_pages#about
  contact        /contact(.:format)        static_pages#contact

在回復評論時,失敗的測試是:

   describe "signup" do

      before{ visit signup_path }
      let(:submit) {"Create my account"}

      describe "with invalid information" do
        it "should not create a user" do
          expect{click_button submit }.not_to change(User, :count)
        end
      end

      describe "with valid information" do
        before do
          fill_in "Name", with: "Example User"
          fill_in "Email", with: "user@example.com"
          fill_in "Password", with: "foobar"
          fill_in "Confirmation", with: "foobar"
        end

        it "should create a user" do
          expect{click_button submit}.to change(User, :count).by(1)
        end
      end
    end

提前感謝任何建議!

測試應該在那時通過。 繼續關注本教程,您將看到它是如何工作的。

在鏡像錯誤代碼並直接進入此處之前,我在同樣的事情上掙扎了大約半小時。 @mhartl顯然是正確的,並且教程中沒有拼寫錯誤,只是當他說“注冊頁面的測試”應該再次起作用時,它有點令人困惑。 他沒有提到注冊頁面提交的內容(這應該是教程中此時失敗的兩個測試)。

我有同樣的問題(兩個注冊測試仍未在7.3.1結束時通過)后來發現我犯了以下錯誤:

當我在Users控制器中添加create方法時,我不小心用create方法覆蓋了new方法(我把它們搞糊塗了)。 但是,您需要兩種方法。 現在它有效。

我希望這對某人有幫助!

application.rb文件中的config.use_transactional_fixtures = true

並確保您在userscontroller中定義了一個創建操作

將此添加到您的app / controller / users_controller.rb:

class UsersController < ApplicationController
  attr_accessible :tags_attributes
  # GET /users
  # GET /users.json
  def index
    @users = User.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @users }
    end
  end

  # GET /users/1
  # GET /users/1.json
  def show
    @user = User.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @user }
    end
  end

  # GET /users/new
  # GET /users/new.json
  def new
    @user = User.new

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @user }
    end
  end

  # GET /users/1/edit
  def edit
    @user = User.find(params[:id])
  end

  # POST /users
  # POST /users.json
  def create
    @user = User.new(params[:user])

    respond_to do |format|
      if @user.save

        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.json { render json: @user, status: :created, location: @user }
      else
        format.html { render action: "new" }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  # PUT /users/1
  # PUT /users/1.json
  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: "edit" }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /users/1
  # DELETE /users/1.json
  def destroy
    @user = User.find(params[:id])
    @user.destroy

    respond_to do |format|
      format.html { redirect_to users_url }
      format.json { head :no_content }
    end
  end
end

您需要添加一個create操作(我遇到了同樣的問題):

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

  def new
    @user = User.new
  end


  def create
    @user = User.new(params[:user])
    if @user.save
      flash[:success] = "Welcome to the Sample App!"
      redirect_to @user
    else
      render 'new'
    end
  end
end

有同樣的問題。 Fix出現在第二版的“注冊失敗”部分,第305頁,所以繼續。 您缺少控制器中的create-action。 如上所述,注冊頁面測試工作的提及令人困惑。 它只是工作的頁面,而不是提交表單。

這本書絕對精湛,是我讀過的最好的編碼書之一,實際上是最好的。 然而,正如經常使用跨越許多頁面的示例代碼或在本例中整本書一樣,它可能會有點混亂,特別是如果你錯過了什么。 這里的解決方案是始終在書中非常清楚地說明什么應該在什么階段工作,什么不存在以及后來要做些什么事情才能讓工作起作用。 哈特爾確實如此,但有些地方仍有可能讓人感到困惑。 重復和拼寫出來的東西不會受到傷害。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM