到Rails控制器的URL编码路由

时间:2010-02-01 18:13:28

标签: ruby-on-rails rest authlogic urlencode

我有一个URL编码资源,例如:

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

这适用于在路径中使用用户登录的RESTful Web服务。问题是导轨中的控制器似乎没有解码%20。我收到以下错误:

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

我实际上要做的是实现2个选项之一(使用authlogic作为我的注册处理程序):

  • 或者(最好)允许用户注册带有空格的用户名,并将这些用户名正确地路由到我的控制器。默认情况下,Authlogic允许空格和@ /。人物 - 如果我可以使它工作,这对我来说还不错......

  • 或者我可以限制authlogic来禁止空格。我知道我可以这样做:

    ... .merge_validates_format_of_login_field_options

但我不完全确定在失败时提供新正则表达式和返回消息的正确语法......

任何建议都非常感谢!

1 个答案:

答案 0 :(得分:1)

通常情况下,在模型中为这种情况设置一个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友好名称的问题。当在to_param的输出中出现点时,Rails尤其令人讨厌。