我有一个'项目'模型。一切正常,但是对它的表演路径并不完全满意。我想使用items表中的某些参数来构建一个更友好的SEO友情链接。所以这是我的问题..
如何更改我的展示操作网址 从 的 'mysite.com/items/1' 至 'mysite.com/items/item-name/item-city/item-id'其中item-name,item-city和item-id对于每个特定项都是动态的。
没有宝石可以实现这个目标吗?如果有,怎么样?如果不是,您建议以最简单的方式实现这一目标?
由于
答案 0 :(得分:1)
您可以通过向模型中添加to_param
方法来做一些相对简单且保持Rails的事情,如下所示:
def to_param
"#{id}-#{name}-#{city.name}"
end
这样做的每次使用像item_path
这样的方法时,都会使用@ item.to_param方法(这就是它现在所做的,并返回:id)。生成正常路线,但用SEO友好的替换:id param。
而另一方面,当您在演出,编辑,删除或更新操作中找到控制器中的(params [:id])时,它将转到to_i
并转向它回到了id。这就是它现在所做的,但是int上的to_i仍然是一个int。
您的网址看起来像
/items/56-boston-itemname
另一个好处是,如果您碰巧更改了项目名称或城市名称,它将适当地更改所有网址,但是通过电子邮件发送的旧网址仍然可以使用。
答案 1 :(得分:1)
解决此问题的一种方法是使用路由通配:
http://guides.rubyonrails.org/routing.html#route-globbing-and-wildcard-segments
你应该可以这样做:
get 'items/*names/:id', to: 'items#show', as: :item_names_path
在*names
中放置任何你想要的东西。这需要一些实验才能做到正确。我可以在item中添加一个方法来创建names
数组。
def names
[city.name, name].uniq.compact
end
然后我相信你会打电话给item_names_path(@item.names, @item)