Por que você tem que especificar explicitamente o escopo com amigas_id?
-
22-09-2019 - |
Pergunta
Estou usando a gem amigável_id. Eu também tenho minhas rotas aninhadas:
# config/routes.rb
map.resources :users do |user|
user.resources :events
end
Então eu tenho URLs como /users/nfm/events/birthday-2009
.
Nos meus modelos, quero que o título do evento seja escopo para o nome de usuário, para que ambos nfm
e mrmagoo
pode ter eventos birthday-2009
sem que eles sejam assados.
# app/models/event.rb
def Event < ActiveRecord::Base
has_friendly_id :title, :use_slug => true, :scope => :user
belongs_to :user
...
end
Eu também estou usando has_friendly_id :username
no meu modelo de usuário.
No entanto, no meu controlador, só estou fazendo eventos pertinentes ao usuário que está conectado (current_user):
def EventsController < ApplicationController
def show
@event = current_user.events.find(params[:id])
end
...
end
Isso não funciona; Eu recebo o erro ActiveRecord::RecordNotFound; expected scope but got none
.
# This works
@event = current_user.events.find(params[:id], :scope => 'nfm')
# This doesn't work, even though User has_friendly_id, so current_user.to_param _should_ return "nfm"
@event = current_user.events.find(params[:id], :scope => current_user)
# But this does work!
@event = current_user.events.find(params[:id], :scope => current_user.to_param)
ASSIM, por que preciso especificar explicitamente: escopo se estou restringindo -o a current_user.events? E por que o current_user.to_param precisa ser chamado explicitamente? Posso substituir isso?
Solução
Eu tive exatamente o mesmo problema com amigas_id 2.2.7, mas quando atualizei para amigas_id 3.0.4 no meu aplicativo Rails 2.3.5, tudo funciona. Eu testei todas as quatro invocações que você mencionou no meu aplicativo e elas funcionam.
Algo a tomar nota são algumas alterações da API que podem afetá -lo. Os que encontrei foram:
:strip_diacritics
foi substituído por:strip_non_ascii
.Eu decidi mudar para StringEx's
String#to_url
em vez disso, substituindonormalize_friendly_id
resource.has_better_id?
é agora!resource.friendly_id_status.best?
resource.found_using_numeric_id?
é agoraresource.friendly_id_status.numeric?