2014-10-08 68 views
0

是跟着邁克爾·哈特爾的教程和一個問題,我有是我不斷收到此錯誤​​爲我的節目頁面視圖,我有:Rails是否按照它們寫入的順序或某種順序調用方法?

<% provide(:title, @user.name) %> 
<div class="row"> 
    <aside class="span4"> 
     <section> 
      <h1>    
       <%= gravatar_for @user %> 
       <%= @user.name %> 
      </h1> 
     </section> 
    </aside> 
</div> 

現在在我的用戶控制我不得不下的顯示方法的建立和當我得到這個錯誤新方法:

class UsersController < ApplicationController 

    def new 
    @user = User.new 
    end 

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

    end 


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


    private 
    def user_params 
    params.require(:user).permit(:name, :email, :password, :password_confirmation) 
end 

所以後來當我刪除從展會方法,並把它的製作方法我停下得到錯誤之上。那麼,rails是否以某種順序調用方法?只需要幫助理解爲什麼。

顯示方法的上方移動創建:

class UsersController < ApplicationController 

    def new 
    @user = User.new 
    end 

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

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

    end 





    private 
    def user_params 
    params.require(:user).permit(:name, :email, :password, :password_confirmation) 
end 
+0

以上是方法定義,而不是方法調用。順序無關緊要。由於User.find不成功,你得到了一個無@名稱 - 你去了一個不存在的用戶的網址。 – PSkocik 2014-10-08 00:48:06

回答

1

的問題是,你有一個額外end命令漂浮在你的控制器中:

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

end # This end doesn't belong here 

這導致Rails的認爲它已經到達控制器代碼的末尾,這就是爲什麼您會看到不同的行爲,具體取決於您是否在此額外end之前或之後放置show方法。當您的show方法高於此值時,它被包含在控制器中。當您的show方法低於此值時,它不包含在控制器中。

你會希望你的控制器看起來像這樣:

class UsersController < ApplicationController 

    def new 
    @user = User.new 
    end 

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

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

    private 

    def user_params 
     params.require(:user).permit(:name, :email, :password, :password_confirmation) 
    end 

end # This end statement closes the UsersController class 

然後你的方法的順序並不重要。

另外,在將來,請包括關於在錯誤消息旁邊打印的代碼行的信息。這將幫助更輕鬆地調試問題。

相關問題