URL кодированный маршрут к контроллеру Rails - PullRequest
3 голосов
/ 01 февраля 2010

У меня есть ресурс в кодировке URL, например:

http://myurl/users/Joe%20Bloggs/index.xml

Это для веб-службы RESTful, которая использует логины пользователя в пути. Проблема в том, что контроллер в рельсах, похоже, не декодирует% 20. Я получаю следующую ошибку:

ActionController::RoutingError (No route matches "/Joe%20Bloggs/index.xml" with {:method=>:post}):

Что я на самом деле пытаюсь сделать, так это добиться одного из двух вариантов (используя authlogic в качестве обработчика моей регистрации):

  • Либо (желательно) разрешить пользователям регистрировать имена пользователей с пробелами в них, и они правильно перенаправляются на мой контроллер. Authlogic по умолчанию разрешает пробелы & @ /. персонажи - что меня устраивает, если я смогу заставить это работать ...

  • Или я могу ограничить authlogic, чтобы заглушить пробелы. Я знаю, что могу сделать это с:

    .merge_validates_format_of_login_field_options ...

но я не совсем уверен в правильном синтаксисе для предоставления нового регулярного выражения и возврата сообщения при ошибке ...

Любые предложения с благодарностью!

1 Ответ

1 голос
/ 01 февраля 2010

Как правило, для таких ситуаций лучше иметь в своих моделях безопасное для URL поле «slug». Например:

class User < ActiveRecord::Base
  before_validation :assign_slug

  def to_param
    # Can't use alias_method on methods not already defined,
    # ActiveRecord creates accessors after DB is connected.
    self.slug
  end

  def unique_slug?
    return false if (self.slug.blank?)

    if (new_record?)
      return self.class.count(:conditions => [ 'slug=?', self.slug ]) == 0
    else
      return self.class.count(:conditions => [ 'slug=? AND id!=?', self.slug, self.id ]) == 0
    end
  end

  def assign_slug
    return if (slug.present?)

    base_slug = self.name.gsub(/\s+/, '-').gsub(/[^\w\-]/, '')
    self.slug = base_slug
    count = 1

    # Hunt for a unique slug starting with slug1 .. slugNNN

    while (!unique_slug?)
      self.slug = base_slug + count.to_s
      count += 1
    end
  end
end

Это может решить проблему с не-URL-дружественными именами. Rails особенно хорош, когда речь идет о наличии точек в выводе to_param.

...