NoMethodError, неопределенный метод `name 'для nil: NilClass -rails 3 - PullRequest
1 голос
/ 08 марта 2011

Я получаю NoMethodError в SitesController # index неопределенный метод `поддомен 'для nil: NilClass

У меня есть таблица учетных записей с полем «поддомен» и модель сайта, которая является подклассом модели учетной записи:

class Site < Account

end

create_table "accounts", :force => true do |t|
  t.string   "subdomain"
  t.integer  "user_id"

конец

и есть метод current_account, определенный в application_controller, как этот

 def current_account
  if !is_root_domain?
   current_account = Account.find_by_subdomain(request.subdomains.first)
    if current_account.nil?
     redirect_to root_url(:account => false, :alert => "Unknown Account/subdomain")
  end
  else 
  current_account = nil
 end
return current_account

конец

который вызывает is_root_domain? Метод ниже:

def is_root_domain?
  result = (request.subdomains.first.present? && request.subdomains.first != "www") ? false : true

конец

Я также изменил метод current_account, но получил ту же ошибку:

def current_account
    current_account = Account.find_by_subdomain(request.subdomains.first)
end

В любом из вышеперечисленных сценариев я получаю неопределенный метод `поддомен 'для ошибки nil: NilClass в индексе SitesController #. который показан ниже при попытке доступа к URL:

class SitesController < ApplicationController
  def index
    @site = Site.find_by_subdomain(current_account.subdomain)
  end

 def opps
   @site = Site.find_by_subdomain(current_account.subdomain)
 end

конец

Я пробовал различные приемы борьбы с ошибками ни одного метода, о которых я знаю, например, добавление 'attr_ccessible' и метода initiliaze, но, похоже, ничего не работает. Я также изменил поле таблицы Accounts с «subdomain» на «name», но безуспешно. Любое руководство будет оценено.

Ответы [ 2 ]

1 голос
/ 08 марта 2011

Я думаю, что вы можете быть смущены 'redirect_to' в ApplicationController # current_account.

Это перенаправление происходит не сразу, а после завершения всего остального. Таким образом, ваш метод current_account все равно вернет nil обратно в SitesController # index, где он используется для получения «субдомена», и именно здесь вы получите ошибку.

Если вы вызываете редирект из before_filter, он может обработать этот случай еще до того, как код войдет в ваш метод #index. Я бы перестроил код примерно так.

class ApplicationController

  # get the current account from the subdomain, calling find only if first time..
  def current_account
    unless is_root_domain?
      @current_account ||= Account.find_by_subdomain(request.subdomains.first)
    end
    @current_account
  end

end

А потом:

class SitesController < ApplicationController
  before_filter :require_current_account

  def index
    @site = Site.find_by_subdomain(@current_account.subdomain)
  end

  private
  # makes sure @current_account is setup before using it elsewhere..
  def require_current_account
    if current_account.nil?
      redirect_to root_url(:account => false), :alert => "Unknown Account/subdomain"
    end
  end

end
0 голосов
/ 08 марта 2011

Ваша проблема в том, что current_account - ноль.Убедитесь, что для переменной задан допустимый (существующий) экземпляр объекта.

...