User.find игнорирует метод to_param - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть User модель, с которой я переопределил метод to_param.

Я сделал это так:

class User < ActiveRecord::Base

  def to_param
    if self.id < 100
      if self.id < 10
        s = "00#{self.id}"
      else
        s = "0#{self.id}"
      end
    else
      s = "#{self.id}"
    end
    return "usr-#{s}"
  end

end

И на моем контроллере:

user = User.find(params[:id])
@title = user.name

проблема в том, что ... я не могу получить пользователей ...

, если я изменю метод to_param на: return "#{s}-usr", он просто игнорирует -usr и ищетидентификатор без взятия -usr

я уже пробовал фильтр after_save, но я не мог изменить атрибут там.

как я могу создать уникальный идентификатор для пользователя на основе егоid?

1 Ответ

1 голос
/ 23 ноября 2011

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

class User < ActiveRecord::Base

  # Returns formatted user id:
  #
  #   1    => 'usr-001'
  #   11   => 'usr-011'
  #   111  => 'usr-111'
  #   1111 => 'usr-1111'      
  #
  def to_param
    "usr-%03d" % id
  end 

  def self.from_param(param)
    # ruby strips leading zeros for us (e.g., '012'.to_i returns 12)
    # but we need to remove 'usr-' prefix first
    find(param[4..-1].to_i)
  end 

end

, а затем используйте его там, где вам нужно:

user = User.from_param params[:id]

Кроме того, посмотрите на to_param документы . В описании и примерах четко указано, что этот метод используется для генерации URL-адресов, но разработчик - это тот, кто отвечает за поиск соответствующей записи по этому параметру.

Относительно форматирования строк вы можете найти дополнительную информацию в документах для метода String#% и метода Kernel#format, который он использует.

...