2013-07-23 5 views
8

Ich folge Michael Hartl's Rails Guide (auf Kapitel 9). Wenn ich versuche, auf die Seite zuzugreifen entsprechend dem Profil des Benutzers, zeigt der Browser die folgenden Fehlermeldungen:Before_action in User Controller Rendering Fehler: NoMethodError in Users # show

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 

Hier mein users_controller.rb ist

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 

Die Seite lädt fein, ohne die Zeile:

Aber mit seiner Aufnahme gehen Dinge schief und ich kann nicht herausfinden warum.

Auch hier ist die 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 

Jede Hilfe ist willkommen!

+0

Routen Datei bitte und was ist die URL, wenn Sie auf diese Seite zugreifen. – rmagnum2002

+0

das bedeutet, dass Sie im Profil des Benutzers keinen Benutzer erhalten. – Debadatt

+0

Ich habe gerade die routes-Datei im ursprünglichen Beitrag hinzugefügt. Die URL ist http: // localhost: 3000/users/1 –

Antwort

17

Statt Bevor Aktion in Users_controller versuchen, bevor Filter So sieht der Code wie folgt:

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

ich genau das gleiche Fehler hatte!

1

Zusätzlich zu @Hurman Gul Antwort umbenannt, ich werde Ihnen hoffentlich geben einige Details darüber, warum dieses Problem bei Ihnen zu sehen ...


der Controller eine Aktion

der Fehler, den Sie haben, weil einer Ihrer Aktionen versucht, eine Aktion auf eine Variable auszuführen, die entweder nicht gesetzt ist, oder hat keinen Inhalt auf einem nicht-Existierende Variable

ausführt (ist null). Der Fehler bedeutet im Grunde, dass Sie versuchen, die „.name“ Teil einer Variablen zu nennen, in denen es nicht

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 

Dies bedeutet im Grunde, dass Ihrer Ansicht nach nicht vorhanden ist, sind Sie zu laden @user versuchen .name, wenn @user wahrscheinlich nicht existiert. Die Art, wie ich empfehlen diese Festsetzung würde, ist zunächst eine gewisse Logik zu Ihrer Ansicht anwenden:

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

your code 

<% end %> 
1

ich das gleiche Problem 4.1.6 Verwendung hatte. Das Problem ist, dass Sie die before_action als private definiert haben, ich weiß nicht warum, aber diese Art von Sichtbarkeit verträgt sich mit der Before_action Last des Controllers in Rails. Also bring einfach signed_in_user außerhalb dieses Bereichs und es sollte wieder funktionieren.

Hoffe, das hilft!