1

nil:NilClass の SitesController#index 未定義メソッド「サブドメイン」で NoMethodError を取得しています

「サブドメイン」フィールドを持つ Accounts テーブルと、Account Model のサブクラスである Site モデルがあります。

class Site < Account

end

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

終わり

そして、このように applications_controller で定義された current_account メソッドがあります

 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

上記のシナリオのいずれかの下で、SitesController#index で nil:NilClass エラーの未定義メソッド「サブドメイン」が発生します。これは、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」と初期化メソッドを追加するなど、私が知っているメソッドエラーと戦うためのさまざまなトリックを試しましたが、何も機能していないようです。また、アカウント テーブル フィールドを「サブドメイン」から「名前」に変更しましたが、成功しませんでした。どんなガイドでも大歓迎です。

4

2 に答える 2

1

ApplicationController#current_account の「redirect_to」に混乱するかもしれません。

このリダイレクトはすぐには発生しません。他のすべてが終了したときに発生します。そのため、current_account メソッドは引き続き SitesController#index に nil を返します。そこで「サブドメイン」を取得するために使用され、そこでエラーが発生します。

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
于 2011-03-08T15:46:23.450 に答える
0

あなたの問題は、それcurrent_accountがゼロであることです。変数を有効な (既存の) オブジェクト インスタンスに設定していることを確認してください。

于 2011-03-08T15:47:48.363 に答える