2013-12-01 8 views
0

Я хочу иметь URL из пользователей через профиль в этом формате: mydomain.com/usernameРельсы пользовательский маршрут для профиля пользователя

я начал реализовать в модели пользователя:

user.rb

before_create :create_permalink 
. 
. 
def to_param 
    permalink 
end 
. 
. 
private 

    def create_permalink 
    self.permalink = username.downcase 
    end 

users_controller.rb

def show 
    @user = User.find_by_permalink(params[:permalink]) 
end 

routes.rb

match "/:permalink", to: "users#show", via: 'get' 

Когда я посещаю mydomain.com/username профиль пользователя делает дисплей, но когда я делаю это через user_path(current_user) ссылку, я получаю эту ошибку

undefined method `username' for nil:NilClass 

и URL является mydomain.com/user/ имя пользователя, которого я не хочу.

Как отредактировать маршрут рельсов по умолчанию и отредактировать маршрут пользователя в формате, который я хочу?

routes.rb:

Code::Application.routes.draw do 
    resources :users, except: [:edit, :show] 
    resources :sessions, only: [:new, :create, :destroy] 

    root 'pages#home' 

    match '/help', to: 'pages#help', via: 'get' 
    match '/about', to: 'pages#about', via: 'get' 
    match '/contact', to: 'pages#contact', via: 'get' 

    match '/signup',   to: 'users#new',  via: 'get' 
    match '/signin',   to: 'sessions#new',  via: 'get' 
    match '/signout',   to: 'sessions#destroy', via: 'delete' 

    get '/:permalink',  to: 'users#show', as: 'user' 
    get '/:permalink/edit', to: 'users#edit', as: 'edit_user' 
end 

После удаления только as: 'user' линии и оставил as: 'edit_user' я побежал bundle exec rake routes | grep -i "user":

users GET /users(.:format)   users#index 
      POST /users(.:format)   users#create 
new_user GET /users/new(.:format)  users#new 
    user PATCH /users/:id(.:format)  users#update 
      PUT /users/:id(.:format)  users#update 
      DELETE /users/:id(.:format)  users#destroy 
    signup GET /signup(.:format)   users#new 
      GET /:permalink(.:format)  users#show 
edit_user GET /:permalink/edit(.:format) users#edit 

ответ

0

Не используйте вспомогательные методы, дают имена маршрутам:

get '/:permalink',  to: 'users#show', as: 'user' 
get '/:permalink/edit', to: 'users#edit', as: 'edit_user' 

это чище, вы также все antages именованных маршрутов

EDIT: Ваш ресурс создает «пользователь» под названием маршрут для действия обновления

user PATCH /users/:id(.:format)  users#update 

У вас есть два варианта, чтобы исправить это:

1- Самый простой (я бы рекомендую это): использовать другое имя для этих двух новых маршрутов:

get '/:permalink',  to: 'users#show', as: 'custom_user' 
get '/:permalink/edit', to: 'users#edit', as: 'custom_edit_user' 

Теперь вы называете эти действия как «custom_user_path» и «custom_edit_user_path», нет конфликта

2- более сложным: пользователь другое имя ресурса

resource :users, except: [:edit, :show], as: 'old_users' 
... 
... 
get '/:permalink',  to: 'users#show', as: 'user' 
get '/:permalink/edit', to: 'users#edit', as: 'edit_user' 

Таким образом, вы можете использовать user_path и edit_user_path, но все остальные «пользователь *» маршруты должны измениться на «old_user * _path» , например: вместо «new_user_path» вам нужно будет использовать «new_old_user_path».

Я рекомендую вам использовать 1-ые варианты, проверить весь код и использовать «custom_user_path» или «custom_edit_user_path», и вы будете делать

+0

Но делать это дает мне эту длинную ошибку: 'Invalid название маршрута, уже в use: 'user' Вы, возможно, определили два маршрута с тем же именем, используя опцию ': as', или вы можете переопределить маршрут, уже определенный ресурсом с тем же наименованием.Для последнего вы можете ограничить маршруты, созданные с помощью «ресурсов», как описано здесь: http: // guide.rubyonrails.org/routing.html # restricting-the-routes-created' – Tim

+0

Я также добавил 'resources: users, кроме: [: show,: edit] ', но он по-прежнему не работает. – Tim

+0

do "bundle exec rake routes" перед добавлением опций as: options и посмотреть, какое действие создает «пользовательский» маршрут, и добавьте это действие в исключение вместо: show, может быть, это что-то еще – arieljuod

Смежные вопросы