Некоторая помощь в выяснении этого рубина на рельсах, связанных с ошибкой, отображаемой в журнале - PullRequest
1 голос
/ 10 января 2012

Сайт работает нормально, но я замечаю, что эта ошибка появляется в моих журналах.

Started GET "/favicon.ico" for 127.0.0.1 at 2012-01-10 12:03:54 +0000
  Processing by UsersController#show as 
  Parameters: {"username"=>"favicon"}
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."username" = 'favicon' LIMIT 1
Completed 500 Internal Server Error in 1ms

NoMethodError (undefined method `profile' for nil:NilClass):
  app/controllers/users_controller.rb:32:in `show'

Rendered /Users/greg/.rvm/gems/ruby-1.9.3-p0@devvo/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.3ms)
Rendered /Users/greg/.rvm/gems/ruby-1.9.3-p0@devvo/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.0ms)
Rendered /Users/greg/.rvm/gems/ruby-1.9.3-p0@devvo/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (5.0ms)

Такое случается, когда когда-либо совершаются вызовы в мою таблицу профилей:

Started GET "/favicon.ico" for 127.0.0.1 at 2012-01-10 12:14:10 +0000
  Processing by UsersController#show as 
  Parameters: {"username"=>"favicon"}
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."username" = 'favicon' LIMIT 1
Completed 500 Internal Server Error in 1ms

NoMethodError (undefined method `profile' for nil:NilClass):
  app/controllers/users_controller.rb:32:in `show'

Пользовательский контроллер:

class UsersController < ApplicationController

  before_filter :correct_user, :only => [:edit, :update]
  before_filter :logged_in_now, :only => [:settings]


  def new
    @user = User.new 
    @title = "Practice"
  end

  def create
    @user = User.new(params[:user])   
    respond_to do |format|
      if @user.save 
        @user.build_profile.save #same as Profile.new(:user_id => @user.id)
        login @user
        UserMailer.join_confirmation(@user).deliver
        format.js   { render :js => "window.location = '#{root_path}'" } 
     #   flash[:notice] = "Welcome!"
      else

        format.js   { render :form_errors }
      end
    end
  end


  def show

     @user = User.find_by_username(params[:username])
     @profile = @user.profile

  end

  def update
     respond_to do |format|
   @user = User.find(params[:id])
    if @user.update_attributes(params[:user])
    login @user
    format.js   { render :js => "window.location = '#{settings_account_path}'" } 
    flash[:success] = "Profile updated" 
    else
     format.js   { render :form_errors }

      end
      end
  end

  def edit

  end

  def settings
  @user = current_user
  #redirect_to settings_account_path
  end

  def account
  @user = current_user
  end

  private

  # def authenticate
  #   deny_access unless logged_in?
  # end

  def correct_user
    @user = User.find(params[:id])
    redirect_to root_path unless current_user?(@user)
  end

     def logged_in_now

    redirect_to root_path if !logged_in?

  end


end

Показать представление:

<%= @profile.motd %> <br />
<%= @profile.first_name %> <br />
<%= @profile.last_name %> <br />
<%= @profile.user_id %> <br />
<%= @user.id %> <br />
<%= @user.username %> <br />
<%= @user.email %><br />
Star sign: <%= @profile.birthday.zodiac_sign %>

Маршруты:

Swoggo::Application.routes.draw do

  resources :users
  resources :sessions
  resources :passwords
  resources :profiles


  root :to                   => "users#new"
  match 'success'            => "users#success"
  match 'login'              => "sessions#new"
  match 'logout'             => "sessions#destroy"
  match 'reset_password'     => "passwords#new"
  match 'setup_new_password' => "passwords#edit"
  match 'settings', :to      => "users#settings"


  match "/settings/account", :to => "users#account"
  match "/settings/edit_profile", :to => "profiles#edit_profile"


  match '/:username', :controller => 'users', :action => 'show'

Не совсем уверен, почему он заинтересован в значке.

Любой совет приветствуется.

С уважением

Ответы [ 2 ]

4 голосов
/ 10 января 2012

Похоже, у вас есть универсальный маршрут, который соответствует /: username и указывает на ваш пользовательский контроллер.Поэтому, когда кто-то нажимает на /favicon.ico, он идет к контроллеру, но не может найти пользователя с таким именем.

Во-первых, в вашем контроллере пользователей вы должны отправить обратно 404, если не можете найтиимя пользователя.Вы можете легко добавить удар, чтобы сделать это:

User.find_by_username!(params[:username])

Но для браузеров вполне нормально искать значок сайта (потому что это местоположение по умолчанию).Я бы либо добавил маршрут для значка в файле маршрутов и / или установил favicon_link_tag в вашем application.html.erb, чтобы указать, где находится ваш значок.

1 голос
/ 10 января 2012
  match '/:username', :controller => 'users', :action => 'show'

перенаправляет запросы для "/favicon.ico" на UsersController # show.

 @user = User.find_by_username(params[:username])

пытается найти пользователя с именем пользователя favicon. Не может, поэтому возвращает ноль.

 @profile = @user.profile

затем пытается вызвать profile возвращенного объекта nil. Это приводит к ошибке, которую вы видите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...