Rails是按照写入顺序还是按顺序调用方法?

时间:2014-10-08 00:29:48

标签: ruby-on-rails

按照Michael Hartl的教程和我遇到的一个问题,我一直收到此错误undefined method 'name' for nil:NilClass我的展示页面视图:

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

现在在我的用户控制器中,当我收到此错误时,我在create和new方法下使用了show方法:

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

那么当我从show方法中删除并将其放在create方法之上时,我就停止了错误。那么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

1 个答案:

答案 0 :(得分: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认为它已经到达控制器代码的末尾,之前这就是为什么你会看到不同的行为,这取决于你是否在此额外{之前或之后放置show方法{ {1}}。当您的end方法高于此值时,它将包含在控制器中。当您的show方法低于此值时,它不会包含在控制器中。

您希望控制器看起来像这样:

show

然后你的方法的顺序无关紧要。

此外,将来请包含有关错误消息旁边打印的代码行的信息。这样可以更轻松地帮助调试问题。