我在视图中有以下循环
<% @posts.each do |post| %>
<%= link_to post do %>
Some html
<% end %>
<% end %>
以上代码将生成localhost:3000/posts/sdfsdf-sdfsdf
但我希望将链接设为localhost:3000/sdfsdf-sdfsdf
这是我的路线
resources :posts, except: [:show]
scope '/' do
match ':id', to: 'posts#show', via: :get
end
答案 0 :(得分:8)
你可以这样做:
#config/routes.rb
resources :posts, path: "" #-> domain.com/this-path-goes-to-posts-show
-
另外,请确保将其放在路线的底部;因为它会覆盖任何前面的路线。例如,domain.com/users
将重定向到posts
路径,除非在posts
文件的底部定义了routes.rb
路径
-
<强> friendly_id 强>
为了实现基于slug的路由系统(适用),您最适合使用friendly_id
。这允许.find
方法查找slug
以及id
扩展模型:
#app/models/post.rb
Class Post < ActiveRecord::Base
extend FriendlyID
friendly_id :title, use: [:slugged, :finders]
end
这将允许您在控制器中使用以下内容:
#app/controllers/posts_controller.rb
Class PostsController < ApplicationController
def show
@post = Post.find params[:id] #-> this can be either ID or slug
end
end
答案 1 :(得分:-1)
你需要告诉路线路径的名称是什么。
在routes.rb中你可以做类似的事情:
get '/:id', constraints: { the_id: /[a-z0-9]{6}\-[a-z0-9]{6}/ }, to: 'posts#show', as: :custom_name
之后当你运行“耙路线”时你会看到:
Prefix Verb URI Pattern Controller#Action
custom_name GET /:id(.:format) post#show {:id=>/[a-z0-9]{6}\-[a-z0-9]{6}/}
现在你有了前缀动词,你可以用它来生成链接: &lt;%= link_to&#39;显示&#39;,custom_name_path(post.id)do%&gt; 一些HTML &lt;%end%&gt;