Rails 3.1 - до фильтра и ошибки базы данных - PullRequest
0 голосов
/ 31 октября 2011

У меня проблемы с отложенной загрузкой, я почти уверен в этом ... возможно, вы могли бы указать мне, где я потерпел неудачу.

def setup_guild
 if params[:guild]
  @guild = Guild.where(:short_name => params[:guild].upcase).first
  if @guild.nil?
    puts "no guild with short name #{params[:guild]} found"
    redirect_to root_path 
  else
    @title = t "layout.guild_title", :guild_name =>  (@guild.name).capitalize
  end
 else
  @guild = nil
 end
end

Который вызывается в ApplicationControllerв качестве фильтра перед.Сначала я использовал Guild.find_with_short_name, но у меня был тот же тупой ответ, что и сейчас ... а именно:

undefined method `capitalize' for nil:NilClass
app/controllers/application_controller.rb:29:in `setup_guild'

То есть, как вы можете догадаться, строка @title там вверху.

Дело в том, что если я попробую что-то похожее в консоли, то получу ожидаемый результат

ruby-1.9.2-p0 > guild = Guild.where(:short_name => "ICPT").first
  Guild Load (0.5ms)  SELECT "guilds".* FROM "guilds" WHERE "guilds"."short_name" = 'ICPT' LIMIT 1
 => #<Guild id: 2, name: "Inception", detail: "Inception Guild", game_server_id: 2, created_at: "2011-10-30 17:41:19", updated_at: "2011-10-30 17:41:19", short_name: "ICPT"> 
ruby-1.9.2-p0 > guild.name.capitalize
 => "Inception" 

Более того, если я добавлю что-то вроде "put @ guild.inspect" сразу после получения, капитализация будет работатьхорошо, поэтому я думаю, что это сбой при отложенной загрузке.

Я был бы счастлив иметь некоторое представление о том, как решить эту глупую проблему ... Я действительно не хочу иметь @ guild.inspect дляв моем коде ничего нет, я считаю, что это неудачное решение ...

Спасибо!

@ PanayotisMatsinopoulos Как и было предложено, вот таблица Гильдии:

create_table "guilds", :force => true do |t|
    t.string   "name"
    t.text     "detail"
    t.integer  "game_server_id"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "short_name"
  end

@PanayotisMatsinopoulos Вот, пожалуйста, мой друг;) Мне все еще нужно i18n

#encoding: utf-8
class Guild < ActiveRecord::Base
  belongs_to :game_server
  has_one :game, :through => :game_server
  has_many :announcement, :dependent => :destroy
  validates_presence_of :name, :on => :create, :message => "dois avoir un nom"
  validates_presence_of :detail, :on => :create, :message => "dois avoir une description"
  validates_presence_of :game, :on => :create, :message => "dois appartenir a un jeu"
  validates_presence_of :short_name, :on => :create, :message => "dois avoir un acronyme"
  validates_uniqueness_of :short_name, :on => :create, :message => "est deja utilise"
  validates_length_of :short_name, :within => 3..5, :on => :create, :message => "dois faire entre 3 et 5 caracteres"
  validates_exclusion_of :short_name, :in => %w( users admin guilds events loots sessions characters games password), :on => :create, :message => "ne peux pas utilisé se genre d'acronyme"
  validates_uniqueness_of :name, :on => :create, :message => "est deja utilise"

  has_many :guild_mates, :dependent => :destroy
  has_many :guild_ranks, :dependent => :destroy
  has_many :guild_settings, :dependent => :destroy
  has_many :events, :dependent => :destroy
  has_many :characters, :dependent => :destroy

  before_validation :short_name_check ,:on => :create

  after_create :guild_basic_settings

  def guild_basic_settings
    GuildSettingType.all.each do |grst|
      grs = GuildSetting.create do |g|
        g.guild_id = self.id
        g.guild_setting_type_id = grst.id
        g.value = "false"
      end    
    end
    set_setting(["setting_allow_basic_access_for_public","setting_allow_application",
      "setting_allow_event_read_for_public","setting_allow_announcement_read_for_public"],"true")
  end

  def set_setting(setting,value)

    if setting.class == Array
      setting.uniq!
      setting.each do |ar|
        set_setting(ar,value)
      end
    else
      grs = nil
      if setting.class == String
        grs = guild_settings.includes(:guild_setting_type).where(:guild_setting_type => {:name => setting}).first
        return if grs.nil?
      else
        grs = guild_rank_settings.where(:guild_setting_type => setting)
        return if grs.nil?
      end

      grs.value = value
      grs.save
    end
  end

  def short_name_check
    short_name.upcase! if short_name
  end

  def full_name
    "#{name.capitalize} - #{game_server.name}"
  end

  def characters_for_user(user)
    characters.where(:user_id => user.id)
  end

  def method_missing(method,*args)
    check = method.to_s.split("_")
    if(args.count == 0)
      if check[0] == "setting"
         grs = guild_settings.joins(:guild_setting_type).where(:guild_setting => { :guild_setting_types => {:name => method.to_s}}).first
          unless grs.nil?
            return grs.value == "true" ? true : false
          else
            raise "Guild > Method Missing > unknown setting : #{method.to_s}"
          end
      end
    end
  end

end

Редактировать: Я только что видел, что не пропустил супер метод ... может ли это быть проблемой?

Ответы [ 3 ]

1 голос
/ 31 октября 2011

Хорошо, похоже, проблема была в моей реализации method_missing.Не хватало супер звонка ... Теперь, когда он восстановлен, все работает отлично.не удивительно.

Спасибо @PanayotisMatsinopoulos за вашу помощь :) (также спасибо за хороший сон; p)

0 голосов
/ 31 октября 2011

True.method_missing должен позвонить super в конце.Но я не уверен, что ваша проблема есть.Это может быть.Может и нет.

С другой стороны, позвольте мне сказать кое-что, что, по моему мнению, имеет больше шансов стать вашей проблемой.Это тот факт, что вы выполняете проверку только на presence из name :on => :create.Это означает, что обновление объекта Guild, который не содержит name, пройдет проверку и будет без проблем сохранено в базе данных.Тогда ваш setup_guild обязательно выдаст ошибку:

undefined method `capitalize' for nil:NilClass
app/controllers/application_controller.rb:29:in `setup_guild'

т.е. ошибка, с которой началось это обсуждение.

Следовательно, я предлагаю удалить ваше условие :on => :create при проверкеname.(Кстати ... я предлагаю вам удалить его из всех ваших проверок, если вы не знаете, что делаете)

Но тогда я не могу доказать, что это была ваша проблема в первую очередь.Я просто привожу здесь мой совет, а не положительный ответ в качестве решения вашей проблемы.

0 голосов
/ 31 октября 2011

Вы должны проверить, если имя также ноль:

if @guild.nil? || @guild.name.nil?
...