为什么我得到“未定义的方法”?

发布于 2024-10-27 15:27:57 字数 348 浏览 1 评论 0原文

我有一个配置文件模型,并且一个用户 has_one 配置文件。

这是我的路线:

resources :users
resources :profiles

这是我的控制器中的显示方法:

def show
  @profile = @user.profile
end

为什么当我尝试访问显示视图时会收到此错误:

NoMethodError in ProfilesController#show

undefined method `profile' for nil:NilClass

I have a profile model, and a user has_one profile.

Here's my route:

resources :users
resources :profiles

Here's the show method in my controller:

def show
  @profile = @user.profile
end

Why do I get this error when I try to access the show view:

NoMethodError in ProfilesController#show

undefined method `profile' for nil:NilClass

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

过期以后 2024-11-03 15:27:57

您需要初始化@user实例变量。你可能想做这样的事情:

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

无聊的解释:实例变量(前面有@的变量)默认是nil。它们实际上可以通过为其分配一个非零值来“实例化”。这里,@user是一个实例变量,它指向nil,因为它还没有被分配任何东西。 profilenil 的上下文中调用,它没有 profile 方法,因此您会得到 no method 异常。这与局部变量相反,局部变量以小写字母开头,在这种情况下会引发局部变量未找到异常。

You need to initialize the @user instance variable. You probably want to do something like this:

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

Boring explanation: Instance variables (the ones with @ in the front) are nil by default. They can be de facto "instantiated" by just assigning a non-nil value to it. Here, @user is an instance variable, and it points to nil because it hasn't been assigned anything. profile is invoked in the context of nil, which doesn't have a profile method, so you get the no method exception. This is as opposed to local variables, starting with a lower-cased letter, which would in this case have raised a local variable not found exception.

慕烟庭风 2024-11-03 15:27:57

因为@user对象是nil?您在尝试使用 @user 实例变量之前是否填充了它?

Because @user object is nil? Did you populate @user instance variable before trying to use it?

多像笑话 2024-11-03 15:27:57

那是因为 @user 为零,你需要这样的东西

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

That is because the @user is nil, you need something like this

def show
  @user = User.find(params[:id]) 
  @profile = @user.profile
end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文