使用to_param重新路由模型内容

时间:2013-03-19 22:24:07

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

我想扩展与名为Product的模型内容相关联的网址,目前,我可以转到products/ID查看特定产品。

我想扩展产品网址,使其包含更多描述性信息,例如产品名称。

我之前被建议调整to_param函数(在Product.rb中),如下所示:

def to_param
  "#{id}-#{product_name.parameterize}"  
end

但是,目前这不起作用。当您将鼠标悬停在其上/单击它时,与每个产品关联的网址会正确显示,但找不到匹配的产品。我收到错误no match for ID=ID-specific-product-name

如果我访问/products/id,我仍然可以成功查看特定项目

有人可以指导我如何生成包含产品名称(:product_name)的较长网址吗?

修改

我的控制器中的show控制器操作是:

def show
@uniqueturbo = Uniqueturbo.find(params[:id])

respond_to do |format|
  format.html # show.html.erb
  format.xml  { render :xml => @uniqueturbo }
end
end

1 个答案:

答案 0 :(得分:1)

如果您正在尝试制作一些SEO友好网址

http://www.yourdomain.com/products/123123-My-Little-PonyBook

  • 我认为最简单的方法是改变路线,比如

    获取'/ products /:title /:id'=> “产品#秀”

然后你会得到seo友好的网址:

http://www.yourdomain.com/products/My-Little-PonyBook/123123

要生成此网址,请创建帮助

def url_for_product(product)
  "/products/#{product.title}/#{product.id}"
end
  • 另一种方法是保留正常的RESTful路由,并重新分析'id'参数,如:

    def show
      product_id = params[:id].split('_')[0] # :-)
      # ...
    end
    

仍然需要帮助方法,这次,如:

def url_for_product(product)
   product_path(product) + "_#{product.title.tableize}"
end