最简单的路径与变量和字符串?—Rails 3.1



我有一个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