Pourquoi vous devez spécifier explicitement la portée avec friendly_id?
-
22-09-2019 - |
Question
J'utilise la pierre précieuse friendly_id. J'ai aussi mes itinéraires imbriqués:
# config/routes.rb
map.resources :users do |user|
user.resources :events
end
J'ai donc URL comme /users/nfm/events/birthday-2009
.
Dans mes modèles, je veux le titre de l'événement à portée a été définie au nom d'utilisateur, de sorte que les deux nfm
et mrmagoo
peuvent avoir des événements birthday-2009
sans qu'ils soient slugged.
# app/models/event.rb
def Event < ActiveRecord::Base
has_friendly_id :title, :use_slug => true, :scope => :user
belongs_to :user
...
end
J'utilise aussi has_friendly_id :username
dans mon modèle utilisateur.
Cependant, dans mon contrôleur, je ne tirant les événements pertinents à l'utilisateur qui est connecté (current_user):
def EventsController < ApplicationController
def show
@event = current_user.events.find(params[:id])
end
...
end
Cela ne fonctionne pas; Je reçois le ActiveRecord::RecordNotFound; expected scope but got none
d'erreur.
# 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)
SO , pourquoi dois-je préciser explicitement: la portée si je restreindre à current_user.events de toute façon? Et pourquoi le besoin de current_user.to_param à appeler explicitement? Puis-je remplacer ce?
La solution
J'ai eu exactement le même problème avec friendly_id 2.2.7 mais quand je mis à jour à friendly_id 3.0.4 dans mes Rails 2.3.5 app, tout fonctionne. Je test de tous les 4 invocations de recherche que vous avez mentionné dans mon application et ils travaillent.
Quelque chose à prendre note de quelques modifications de l'API qui peuvent vous affecter. Ceux que je courais en étaient:
-
:strip_diacritics
a été remplacé par:strip_non_ascii
.J'ai décidé de passer à la
String#to_url
de Stringex place en remplaçantnormalize_friendly_id
-
resource.has_better_id?
est maintenant!resource.friendly_id_status.best?
-
resource.found_using_numeric_id?
est maintenantresource.friendly_id_status.numeric?