如何让我的网址看起来像www.example.com/1/product/date/price?

时间:2012-01-25 12:59:31

标签: ruby-on-rails ruby ruby-on-rails-3

我有两种模式:

Price :belongs_to Products
Product :has_many Prices

我创建了新的价格,并且我想让网址看起来像某种方式,所以在我的Price模型中我放了:

def to_param
    "#{id}/#{product.name}/#{purchase_date}/#{price}".parameterize
end

但是,这给了我一个像:

这样的网址
http://localhost:3000/prices/8-turkey-bacon-2012-01-16-2-58

理想情况下,我希望它是:

http://localhost:3000/8/turkey-bacon/2012-01-16/$2.58

我有办法做到这一点吗?


routes.rb - 仅限价格

resources :prices do
  get ":id/:product_name/:purchase_date/:price" => "prices#show"
  get :autocomplete_product_name, :on => :collection
  post :create_multiple, :on => :collection
end

3 个答案:

答案 0 :(得分:1)

这可以做到:

# in routes.rb

get ":id/:product_name/:purchase_date/:price" => "controller#action"

您可以根据需要更改get或添加其他内容(post,put ...)

答案 1 :(得分:1)

如果您只想修复to_param方法,请删除parameterize(如@yoavmatchulsky建议的那样)。如果idnamepurchase_dateprice可能包含网址中不允许的字符,请执行以下操作:

require 'uri'

class Price < ActiveRecord::Base
  def to_param
    URI.encode("/#{id}/#{product.name}/#{purchase_date}/#{price}")
  end
end

答案 2 :(得分:1)

Ryan Bates在Pretty URLs with FriendlyId上有一个很好的截屏视频。 FriendlyId Gem将帮助您维护和生成友好URL