Как переместить example.com/profiles/1 в example.com/username с friendly_id с именем пользователя из модели пользователя? - PullRequest
0 голосов
/ 11 октября 2011

У меня есть красные документы на friendly_id для рельсов.Это просто: вы устанавливаете определенный атрибут как слаг.

example.com / username

User has_one profile
Profile belongs_to User

Итак, вы видите мою дилемму.У меня нет имени пользователя столбца в модели профиля.Как связать модель пользователя, поле имени пользователя, чтобы я мог использовать example.com/username с friendly_id?

Конечно, это относительно просто.

Ответы [ 3 ]

2 голосов
/ 18 ноября 2011

Вы можете использовать «универсальный» маршрут в конце файла маршрутов:

map.connect ':username', :controller => 'profiles', :action => 'show' (this is for Rails 2.3)

И в контроллере профилей метод show проверяет, есть ли пользователь с таким именем,если он принадлежит текущему профилю

def show
  if User.find_by_username(params[:username])
    if @current_user == User.find_by_username(params[:username])  
     # @profile = @current_user.profile
     # render projects#show view 
    else
     # flash error message, because the current user tries to access other users profile (in case your app doesn't allow it)
  else
    # render page not found error 
  end
end

У меня была похожая ситуация для модели проектов из проектов / id => / имя_проекта.Это немного проще в вашем случае, потому что в БД у вас есть уникальные имена пользователей.Ах, и никаких дополнительных драгоценных камней не участвуют.

1 голос
/ 11 октября 2011

Вы можете использовать пользовательский метод для генерации пули.

class Profile < ActiveRecord::Base
  has_many :users

  has_friendly_id :custom_url_method, :use => :slugged

  def custom_url_method
     self.user.username.to_url
  end

to_url из камня Stringex. Вы также можете использовать один из вспомогательных методов Babosa, предоставляемых самим Friendly_id.

1 голос
/ 11 октября 2011

В вашем ProfilesController#show:

def show
  @user = User.joins(:profile).where("profiles.username = ?", params[:username])
end

Маршруты:

match ':username' => "profiles#show'

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

class User < ActiveRecord::Base
  def fetch_by_username(username)
    joins(:profile).where("profiles.username = ?", username)
  end
end

А в вашем контроллере:

@user = User.fetch_by_username(params[:username])
...