按照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
答案 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
然后你的方法的顺序无关紧要。
此外,将来请包含有关错误消息旁边打印的代码行的信息。这样可以更轻松地帮助调试问题。