如何在Rails中实现特定样式的URL

时间:2014-06-05 02:52:24

标签: php ruby-on-rails ruby-on-rails-3 url routing

我正在挠头,无法自己解决这个问题。我已经看到了一种特殊的导航风格,即我发现在SEO方面非常好的URL,但无论如何都无法想到在Rails中实现。我在Rails中开发了很少的应用程序,所以了解rails路由,但没有关于特定网站的php的内容。

所以你登陆主页 www.xyz.com

然后,如果您点击任何侧栏链接以查看特定品牌的手机,例如三星,您点击三星手机链接,网址转到 www.xyv.com/samsung_mobile_prices

好了现在从rails的角度思考我们正在查看三星移动对象列表视图。当我们点击一​​个特定的三星模型,例如三星Galaxy J,然后url变为 www.xyz.com/samsung_galaxy_j

在Rails中,我可以得到 www.xyz.com/samsung_mobile_prices/samsung_galaxy_j

但似乎无法理解如何实现 www.xyz.com/samsung_galaxy_j

由于

2 个答案:

答案 0 :(得分:2)

这很容易。您所要做的就是将所有即将到来的请求(/除外)转发到各自的控制器操作,如products#show。这就是我所说的

 match ":id" => 'products#show' , via: :get , as: 'product_direct_url'

答案 1 :(得分:1)

您正在寻找的是clean_urls(也称为slugging):

  

清洁网址,RESTful网址,用户友好的网址或SEO友好的网址   纯结构URL,不包含查询字符串[例如,   action = delete& id = 91]而是仅包含资源的路径   (在方案[例如,http]和权威[例如example.org]之后)。

你要问的是如何应用app-wide slugs(domain.com/[slug]上的slu,而不是domain.com/controller/[slug]


执行此操作有两个步骤 -

<强>路线

#config/routes.rb
root: "controller#action"
... # -> other routes first

#This HAS to be last (otherwise Rails will think every URL is a request to this route)
resources :products, path: "", only: "show"

-

<强>蛞蝓

通过上述路线,您可以访问domain.com/xyz_product

要使其生效,您需要能够在控制器/型号中调用您的产品ids / slugs。要做到这一点,我高度建议使用friendly_id gem

默认情况下,Rails中存在大问题,find方法仅搜索id,而不搜索slugsfriendly_id gem解决了它:

#app/models/product.rb
Class Product < ActiveRecord::Base
    extend FriendlyId
    friendly_id :name, use: [:slugged, :finders]
end

这意味着您可以致电:

#app/controllers/products_controller.rb
def show
    product = Product.find params[:id] #-> id can be a slug or a number :)
end