4

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

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

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

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

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

  • 要么(最好)允许用户注册带有空格的用户名,并将它们正确路由到我的控制器。Authlogic 默认允许空格和@/。角色——如果我能做到的话,这对我来说很好......

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

    .merge_validates_format_of_login_field_options...

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

任何建议都非常感谢!

4

1 回答 1

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 尤其令人讨厌。

于 2010-02-01T20:10:40.313 回答