如何在rails 5中为show动作创建自定义路由?

时间:2017-06-07 04:46:11

标签: ruby-on-rails rails-routing ruby-on-rails-5

我有一个'项目'模型。一切正常,但是对它的表演路径并不完全满意。我想使用items表中的某些参数来构建一个更友好的SEO友情链接。所以这是我的问题..

如何更改我的展示操作网址 从 的 'mysite.com/items/1''mysite.com/items/item-name/item-city/item-id'其中item-name,item-city和item-id对于每个特定项都是动态的。

没有宝石可以实现这个目标吗?如果有,怎么样?如果不是,您建议以最简单的方式实现这一目标?

由于

2 个答案:

答案 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)