2016-10-19 4 views
1

Я закончил учебник Hartl и пытаюсь создать URL-адрес тщеславия для моего твитер-клона так же, как твиттер, например. www.twitter.com/realDonaldTrumpRails route/name вместо/users /: id

Мне удалось заставить мои URL-адреса выглядеть как/users /: slug. Wondering - как я его получу, так это просто /: slug?

Вот что я сделал до сих пор:

1.In моя модель пользователя, нет столбца для «имя пользователя», так что я использовал «имя» вместо этого.

2. Создана новая миграция для добавления столбца slug в пользовательскую модель DB.

3.Plugged в рельсах консоли, чтобы добавить слизней для всех пользователей, набрав:

User.all.each do |user| 
    user.slug = user.name.downcase.parameterize 
    user.save 
end 

4.Configured UsersController показать действие на:

def show 
    @user = User.find_by_slug(params[:id]) 
    @microposts = @user.microposts.paginate(page: params[:page]) 
    redirect_to root_url and return unless @user.activated? 
end 

Теперь, когда я настроил это так показывает/users /: slug, как мне его изменить, так что это просто /: slug?

+0

изменить roue на 'get '/: id', to: 'users # show'' – Sravan

+0

, который, похоже, работает, например, я могу посетить страницу профиля/chloe-schamberger. Но теперь я не могу посетить ни одну из моих страниц. Я получаю сообщение об ошибке: неопределенный метод 'microposts' для ноль: NilClass Защиту показать @user = User.find_by_slug (Params [: ID]) @microposts = @ user.microposts.paginate (страницы: Params [: страница]) redirect_to root_url и вернуть, если только @ user.activated? end – doctopus

+0

Кажется, что всякий раз, когда я посещаю страницы коллекции, например/users,/help,/about, маршруты думают, что: id = пользователи. Как это исправить? – doctopus

ответ

1

Попробуйте это ......

редактировать приложения/модели/user.rb

class User < ActiveRecord::Base 
    extend FriendlyId 
    friendly_id :name, use: :slugged 
end 

User.create! name: "Username" 

Изменение User.find для пользователя .дружелюбный.найти в контроллере

User.friendly.find(params[:id]) 

rails server 

http://localhost:3000/users/username 

Если вы добавляете FriendlyId существующего приложения и нужно генерировать слизень для существующих пользователей, сделать это из консоли , бегуна, или добавить Rake задачи:

User.find_each(&:save) 

Чтобы получить/имя пользователя вместо/Пользователи/имя пользователя попробовать это ...

В у наша модель пользователя добавить

class User < ActiveRecord::Base 
    ... 
    def to_param 
    name 
    end 
    ... 
end 

Но убедитесь, что в вашем контроллере вы найдете пользователей по их названию.

В контроллере добавить

class UsersController < ApplicationController 
    ... 
    def show 
    @user = User.find_by(name: params[:id]) 
    end 
end 

Как для маршрутизации ваших пользователей/имя пользователя, у вас есть несколько вариантов:

get ':id', to: 'users#show', as: 'show' 
resources 'users', path: '/' 

Просто убедитесь, что вы положили эти маршруты в конце файла маршрутов ,

Надеюсь, что это сработает для вас.

+0

Для этого нужен правильный идентификационный символ? Кроме того, я пытаюсь получить/username вместо/users/username – doctopus

+0

@JosephLiu: Да, для этого требуется 'gem 'friendly_id'' –

+0

@JosephLiu: я обновил свой ответ, пожалуйста, посмотрите. Благодаря! –

1

изменить корень с

get '/:slug', to: 'users#show' 

и на вашем UsersController

def show 
    @user = User.find_by slug: params[:slug] 
... 
end 

не забудьте удалить ': шоу' на before_action: set_user, только: [: показать,: edit,: update] вашего контроллера как «set_user» использовать: id и нет: slug для извлечения экземпляра

Остерегайтесь того, что вы должны беспокоиться о слизе uniquene сс в модели при сохранении

before_validation :set_slug  
validates :slug, uniqueness: true 

private 

def set_slug 
... 
end 
0

get '/:slug', to: 'users#show' сделать это последний маршрут и проверить.

Поскольку это именованный маршрут, который мы создали, он должен быть последним, чтобы другие маршруты не нарушались.

В ваших Users Controller

def show 
    @user = User.find_by slug: params[:slug] 
end 
+0

Кажется, что не работает с get '/: slug', но работает с '/: id'. Любая причина для этого? – doctopus

+0

Кроме того, некоторые страницы, похоже, не работают. Например, страница моих подписчиков. Это потому, что мне приходится заменять всюду, что говорит @user = User.find (params [: id]) с User.find_by_slug (params [: id])? – doctopus

+0

работает ли с '/: id', когда вы сохранили его последним? – Sravan