URL编码路由到Rails控制器

4

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

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

这是一个使用用户登录路径的RESTful webservice。问题在于rails中的控制器似乎无法解码%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
通常情况下,在像这样的情况下,为您的模型拥有一个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 特别难处理。


好的,您刚刚超出了我的Rails知识范围..!您能描述一下这段代码在做什么吗?我猜它正在尝试以某种方式将我传递的URL ID及其中的编码转换为可以搜索的登录名? - cmaughan
盯着这个一段时间后,我可以看出你正在将提供的用户名转换为“友好”的字符串。但是这是否解决了到达的URL具有错误编码的问题?我认为它也没有将我指定的路径转换为slug,对吧?我假设你打算以某种方式将slug返回给客户端? - cmaughan
虽然我只是改编了一小段现有的代码来生成这个示例,但我的想法是为任何需要 URL 友好的“slug”的资源创建一个,而在你的情况下,这个资源很可能是用户。赋值函数用于生成足够独特的 slug,在可能存在冲突的情况下(例如 'Bob Jones' vs. 'Bob-Jones'),并将其用作 to_param 的结果,以便将其放入 URL 中。这意味着你必须从那时起使用 User.find_by_slug!(params[:id])。 - tadman
如果在slug之前添加记录的id,就不必费心确保slug是唯一的了:def to_param "#{id}-#{name.gsub(/\s+/, '-').gsub(/[^\w\-]/, '').slice(0..75)}" end。这就是你所需的全部内容。 - Jonathan Julian
这是一个非常简单的方法,可以避免创建唯一的 slug,并且即使重命名资源也能可靠地工作,但对于某些应用程序来说可能不足够。包含数字 ID 的优点在于,您无需执行任何花哨的操作即可找到记录,因为 .to_i 调用将正确提取它。 - tadman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接