【问题标题】:before_action in user controller rendering error: NoMethodError in Users#show用户控制器渲染错误中的 before_action:Users#show 中的 NoMethodError
【发布时间】:2013-07-23 10:22:51
【问题描述】:

我正在关注 Michael Hartl 的 Rails 指南(第 9 章)。当我尝试访问与用户个人资料对应的页面时,浏览器显示以下错误消息:

 NoMethodError in Users#show

Showing /home/jonathan/Desktop/railsTut/sample_app/app/views/users/show.html.erb where line #1 raised:

undefined method `name' for nil:NilClass

Extracted source (around line #1):

1: <% provide(:title, @user.name) %>
2: <div class="row">
3:   <aside class="span4">
4:     <section>

Rails.root: /home/jonathan/Desktop/railsTut/sample_app

这是我的 users_controller.rb

class UsersController < ApplicationController
  before_action :signed_in_user, only: [:edit, :update]

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

  def new
    @user = User.new
  end

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

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

  def update
    @user = User.find(params[:id])
    if @user.update_attributes(params[:user])
         flash[:success] = "Profile updated"
         sign_in @user
         redirect_to @user
      else
           render 'edit'
      end
    end

  def destroy
 User.find(params[:id]).destroy
    flash[:success] = "User destroyed."
    redirect_to users_url
    end

private

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


  # Before filters

  def signed_in_user
    unless signed_in?
        store_location
        redirect_to signin_url, notice: "Please sign in."
    end
 end
end

页面加载正常,没有该行:

before_action :signed_in_user, only: [:edit, :update]

但是由于它的包含,事情会出错,我不知道为什么。

另外,这里是 routes.rb

SampleApp::Application.routes.draw do
  resources :users
  resources :sessions, only: [:new, :create, :destroy]

  root to: 'static_pages#home'

 match '/signup',  to: 'users#new'
  match '/signin',  to: 'sessions#new'
  match '/signout', to: 'sessions#destroy', via: :delete

  match '/help',    to: 'static_pages#help'
  match '/about',   to: 'static_pages#about'
  match '/contact', to: 'static_pages#contact'

end

感谢任何帮助!

【问题讨论】:

  • 请提供路由文件以及访问此页面时的 url 是什么。
  • 这意味着您在用户的个人资料中获得了 nil 用户。
  • 我刚刚在原帖中添加了路由文件。网址是localhost:3000/users/1
  • @Debadatt,好点子,可能是这个 id 的用户不存在
  • @Flo,我想这个想法是可以访问任何用户个人资料以查看它们,而不仅仅是打开您的个人资料。

标签: ruby-on-rails railstutorial.org


【解决方案1】:

如果 Hurman 的回答确实解决了您的问题,原因是您运行的是旧版本(即 before_filter 在此版本中更名为before_action (https://github.com/rails/rails/commit/9d62e04838f01f5589fa50b0baa480d60c815e2c),更多信息请参见Rails 4: before_filter vs. before_action

【讨论】:

    【解决方案2】:

    Users_controller 中的 Before Action 在过滤器之前尝试 所以你的代码看起来像这样:

    before_filter :signed_in_user, only: [:edit, :update]
    

    我遇到了完全相同的错误!

    【讨论】:

      【解决方案3】:

      我在使用 4.1.6 时遇到了同样的问题。 问题是您已将 before_action 定义为private,我不知道为什么,但这种可见性与 Rails 中控制器的 before_action 负载相混淆。因此,只需将signed_in_user 带到该区域之外,它就会重新开始工作。

      希望这会有所帮助!

      【讨论】:

        【解决方案4】:

        除了@Hurman Gul 的回答,我希望能给你一些关于你为什么会看到这个问题的细节......


        您的控制器正在对不存在的变量执行操作

        您遇到的错误是因为您的操作之一是尝试对未设置或没有内容的变量执行操作(nil)。该错误基本上意味着您正在尝试调用不存在的变量的“.name”部分

        undefined method `name' for nil:NilClass
        
        Extracted source (around line #1):
        
        1: <% provide(:title, @user.name) %>
        2: <div class="row">
        3:   <aside class="span4">
        4:     <section>
        
        Rails.root: /home/jonathan/Desktop/railsTut/sample_app
        

        这基本上意味着在您看来,您正在尝试加载@user.name,而@user 可能不存在。我建议解决此问题的方法是最初将一些逻辑应用于您的视图:

        #app/views/users/show.html.erb
        <% unless defined?(@user) %>
            Sorry, we could not find your user!
        <% else %>
        
         your code
        
        <% end %>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-17
          • 1970-01-01
          • 2012-09-27
          • 1970-01-01
          • 1970-01-01
          • 2016-11-16
          • 1970-01-01
          相关资源
          最近更新 更多