Подтвердить что ты не робот

Настроить URL-адрес rails с именем пользователя

Я хочу скопировать страницу профиля твиттера и иметь URL-адрес с именем пользователя http://www.my-app.com/username", и хотя я могу вручную набрать это в адресную строку и перейти к странице профиля, на которую я не могу ссылаться на пользовательский URL.

Я думаю, проблема в маршрутах - вот код на моих маршрутах .rb

map.connect '/:username', :controller => 'users', :action => 'show'

Кроме того, у меня есть модели Question и Answer, и я хочу связать их с настраиваемым URL следующим образом:

http://www.my-app.com/username/question/answer/2210

4b9b3361

Ответ 1

В вашем маршруте нет ничего плохого. Просто не забудьте определить его в конце, определив все остальные маршруты. Я бы также рекомендовал использовать маршруты RESTful, и только если вы хотите, чтобы более привлекательные URL-адреса использовали именованные маршруты. Не используйте map.connect. Здесь хорошее чтение о маршрутах Rails.

Вот как это могло выглядеть:

map.resources :questions, :path_prefix => '/:username' do |question|
  question.resources :answers
end

map.resources :users

map.user '/:username', :controller => 'users', :action => 'show'

Просто черновик, который вы можете продлить.

Ответ 2

Чтобы создать URL-адреса, вам необходимо определить метод to_param для вашей модели пользователя (читать здесь).

class User < ActiveRecord::Base
  def to_param 
    username
  end
end

Ответ 3

Я знаю, что эти вопросы старые, но это поможет кому-то.

Вы можете попробовать следующее. Я использовал его в проекте rails 4, и все, кажется, отлично работают. Причина для as: :admin заключается в том, что я также имел resources posts вне этой области. Он добавит admin к вспомогательным вызовам, например. admin_posts_path

scope ":username", module: 'admin', as: :admin do
  get '', to: 'profiles#show'
  resources :posts
end

Ответ 4

Я так использовал

В части просмотра

portfolio.user.name,: id = > портфолио)% >

и в route.rb

map.show_portfolio "портфолио/: имя пользователя",: action = > 'show_portfolio',: controller = > 'портфели