rails удаляет путь к контроллеру из URL

#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 %>