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

Маршрут Rails для имени пользователя вместо идентификатора

Я пытаюсь изменить маршруты рельсов от /users/ 1 до/username. В настоящее время я настроил это так, чтобы он работал для действий показа и редактирования. Фактическая проблема заключается в том, что когда я иду обновлять пользователя, используя:

<%= form_for @user do |f|%>

Он никогда не обновляется, потому что действие обновления направляется на /users/: id. Есть ли способ маршрутизировать это так, чтобы он работал для /username? (который является маршрутом, который выполняет в моих формах как действие). Я уже немного почесываю голову над этим.

EDIT:

Проблема заключается не в маршрутизации к имени пользователя, а в правильной работе. Проблема заключается в том, что форма маршрутизируется в /username для обновления, однако маршрут обновления для пользователей по-прежнему остается /users/: id вместо:/id.

Я попробовал обновить свои маршруты до этого, но безрезультатно:

match '/:id', :to => "users#show", :as => :user
match '/:id', :to => "users#update", :as => :user, :via => :put
match '/:id', :to => "users#destroy", :as => :user, :via => :delete

EDIT:

Doh! Это устранило проблему:

match '/:id', :to => "users#show", :as => :user, :via => :get
4b9b3361

Ответ 1

В вашей модели пользователя:

def to_param
  username
end

Метод to_param для объектов ActiveRecord использует по умолчанию только идентификатор объекта. Поместив этот код в свою модель, вы перезаписываете значение ActiveRecord по умолчанию, поэтому, когда вы ссылаетесь на пользователя, он будет использовать username для параметра вместо id.

Ответ 2

В модели User переопределите метод to_param, чтобы вернуть то, что вы хотите использовать в URL-адресе.

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

В вашем контроллере вместо использования User.find(params[:id]) вам теперь нужно использовать User.find_by_username(params[:id])

Ответ 4

Вам не нужно переопределять to_param, если вы этого не хотите, вы можете просто указать в теге формы следующее:

<%= form_for @user, :url => user_path(:id => @user.username) do |f|%>