#ruby-on-rails #ruby-on-rails-4 #rails-routing
#ruby-on-rails #ruby-on-rails-4 #рельсы-маршрутизация
Вопрос:
На мой взгляд, у меня есть следующий цикл
<% @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
Ответ №1:
Вы могли бы сделать это:
#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. Приятно — я обновляю информацию о slugs для вас
2. Конечно, я использую дружественный идентификатор, но для ссылки
resources :posts, path: ""
это единственный правильный способ?3. Да, если вы не выводили страницы программно или что-то в этом роде
Ответ №2:
вам нужно указать маршрутам, каким будет имя пути.
в routes.rb вы можете сделать что-то вроде:
get '/:id', constraints: { the_id: /[a-z0-9]{6}-[a-z0-9]{6}/ }, to: 'posts#show', as: :custom_name
после этого, когда вы запустите «rake routes», вы увидите:
Prefix Verb URI Pattern Controller#Action
custom_name GET /:id(.:format) post#show {:id=>/[a-z0-9]{6}-[a-z0-9]{6}/}
Теперь, когда у вас есть префиксный глагол, вы можете использовать его для создания ссылки:
<%= link_to ‘Show’, custom_name_path( post.id ) выполните %>
Некоторый html
<% end %>