2013-07-23 4 views
8

Sto seguendo la guida di Michael Hartl's Rails (nel capitolo 9). Quando provo ad accedere alla pagina corrispondente profilo della dell'utente, il browser visualizza i seguenti messaggi di errore:before_action in Errore di rendering del controller utente: 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 

Ecco il mio 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 

I pagina viene caricata bene anche senza la linea:

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

Ma con la sua inclusione le cose vanno male e non riesco a capire perché.

Inoltre, qui è la 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 

Ogni aiuto è apprezzato!

+0

rotte file per favore e qual è l'url quando si accede a questa pagina. – rmagnum2002

+0

che significa ottenere nil utente nel profilo dell'utente. – Debadatt

+0

Ho appena aggiunto il file di rotte nel post originale. L'URL è http: // localhost: 3000/users/1 –

risposta

17

Invece di Prima azione in Users_controller prova prima filtro Così il vostro codice simile a questo:

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

Ho avuto lo stesso errore esatto!

1

seguito alla risposta di @Hurman Gul, ti si spera darvi alcuni dettagli sul motivo per cui si sta vedendo questo problema ...


del controllore sta eseguendo un'azione su un inesistente variabile

L'errore che hai è perché una delle tue azioni sta cercando di eseguire un'azione su una variabile che è o non è impostata, o non ha un contenuto(è nil). L'errore in pratica significa che si sta cercando di chiamare la parte ".name" di una variabile, in cui non esiste

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 

Questo sostanzialmente significa che a suo avviso, si sta cercando di caricare @user .name, quando @user probabilmente non esiste. Il modo in cui mi piacerebbe consiglia di fissare questo è quello di applicare inizialmente un po 'di logica per la visualizzazione:

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

your code 

<% end %> 
1

Ho avuto lo stesso problema utilizzando 4.1.6. Il problema è che hai definito il before_action come private, non so perché ma questo tipo di visibilità incasina con il carico before_action del controller in Rails. Quindi porta appena signed_in_user fuori da quell'area e dovrebbe ricominciare a funzionare.

Spero che questo aiuti!

Problemi correlati