我有一个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
但我不完全确定在失败时提供新正则表达式和返回消息的正确语法......
任何建议都非常感谢!
答案 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尤其令人讨厌。