我有一个store
模型,如下:
def to_param
slug + "-info"
end
url如下:
/dell-info
/ibm-info
/apple-info
我的路由显然是错误的:
match '/:slug-info' => 'stores#info', :as => :stores
我该如何解决这个问题?如果我使用match '/:slug(-info)'
作为路由,它可以工作,但同时匹配/dell
和/dell-info
你可以给路由添加一些约束,然后去掉控制器中的"-info":
match '/:slug' => 'stores#info', :as => :stores, :constraints => { :slug => /-info$/ }
,然后在控制器中:
def info
slug = params[:slug].sub(/-info$/, '')
#...
end
或者更好的是,在你的模型上有一个方法,可以在它根据段塞查找对象时删除"-info"后缀:
# In the model
def self.for_slug(slug)
slug = slug.sub(/-info$/, '')
find_by_slug(slug)
end
# In the controller
def info
thing = Thing.for_slug(params[:slug])
#...
end