Rails 5路由,URL问题

时间:2019-01-16 15:22:15

标签: ruby-on-rails rails-routing

在更改应用程序上的路由后,尝试使link_to工作时遇到问题。这可能很简单,但老实说,我看不到仅使用对象名称链接到link_to会像更改路由之前那样无法正常工作。

背景:我使用的是friendly_id gem(不确定手动更改url后是否仍需要此功能)。 我也在那里使用了Ancestory gem。

在前置应用程序上。我有一个清单资源,仅用于索引和显示。请参阅以下路线以及以前的工作路线。

# Front facing resources
scope "/:category_name/:category_id" do
    resources :listings, only: [:show], path: '/:title'
end
resources :listings, only: [:index]

之前(工作正常)

# Front facing resources
resources :listings, only: [:index, :show]
resources :auctions, only: [:index, :show]

我已经成功地使我的网址显示以下内容:

listing GET    /:category_name/:category_id/:title/:id(.:format)   listings#show

结果:

http://localhost:3000/listings/helicopter/test-one/4

这将立即执行。我仍在尝试计算结束网址。因此,我可以创建列表并通过在浏览器中手动键入url来查看它。

当我查看列表的索引页面并且我有一个link_to

时,发生错误。

当前代码:

<%= link_to listing.title, listing %>

错误:

No route matches {:action=>"show", :controller=>"listings"}, missing required keys: [:category_id, :category_name, :id, :title]

如何将这些必需的密钥添加到link_to帮助器?我已经尝试了很多方法,但不远。我想只更改show路由不会对任何以前的控制器方法造成太多混乱,并且仍可以通过id找到清单。

任何方向都很好。太感谢了。

***更新****

好吧,在发送以上内容之前,我仔细查看了一下并使其正常工作,但是我问是否有一种更清洁的方法来做到这一点?看起来不怎么“ Rails方式”。我的最终目标是要有一个长的SEO友好链接,其中包含类别和可能的子类别。

工作代码:

<%= link_to listing.title, listing_path(category_name: "listings", category_id: listing.category.name, title: listing.title.parameterize, id: listing.id) %>

结果:

http://localhost:3000/listings/Aircraft/twin-piston-jet/1

请考虑??

1 个答案:

答案 0 :(得分:1)

您可以使用https://api.rubyonrails.org/classes/ActionController/Helpers.html的帮助器

app / helpers / listing_helper.rb

module ListingHelper

  def listing_route(listing, category_name = "Listings")
    listing_path(category_name: listing, category_name: listing.category.name, title: listing.title.parameterize, id: listing.id)
  end

end

您的看法

<%= link_to listing.title, listing_route(listing) %>