Warum müssen Sie explizit Umfang mit friendly_id angeben?
-
22-09-2019 - |
Frage
Ich bin mit der friendly_id gem. Ich habe auch meine Routen verschachtelt:
# config/routes.rb
map.resources :users do |user|
user.resources :events
end
Also ich habe URLs wie /users/nfm/events/birthday-2009
.
In meiner Modelle, möchte ich den Titel der Veranstaltung auf dem Benutzernamen scoped werden, dass so beide nfm
und mrmagoo
können Ereignisse birthday-2009
haben, ohne sie slugged werden.
# app/models/event.rb
def Event < ActiveRecord::Base
has_friendly_id :title, :use_slug => true, :scope => :user
belongs_to :user
...
end
Ich bin auch has_friendly_id :username
in meinem User-Modell verwendet wird.
Doch in meinem Controller, Ich ziehe nur aus Ereignissen an den Benutzer relevant, die angemeldet ist (current_user):
def EventsController < ApplicationController
def show
@event = current_user.events.find(params[:id])
end
...
end
Das funktioniert nicht; Ich erhalte die Fehler 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)
SO , warum muss ich explizit angeben: Umfang, wenn ich es current_user.events sowieso bin zu beschränken? Und warum current_user.to_param Notwendigkeit, explizit genannt werden? Kann ich das außer Kraft setzen?
Lösung
ich hatte genau das gleiche Problem mit friendly_id 2.2.7, aber wenn ich aktualisiert friendly_id 3.0.4 in meiner Rails 2.3.5 app, alles funktioniert. Ich habe Test alle 4 find Anrufungen Sie in meiner app erwähnt und sie arbeiten.
Etwas zur Kenntnis zu nehmen sind ein paar API-Änderungen, die Sie beeinflussen können. Die, die ich lief in waren:
-
:strip_diacritics
hat mit:strip_non_ascii
ersetzt.Ich beschloss, Stringex des
String#to_url
zu wechseln, anstatt durchnormalize_friendly_id
zwingenden -
resource.has_better_id?
ist jetzt!resource.friendly_id_status.best?
-
resource.found_using_numeric_id?
ist jetztresource.friendly_id_status.numeric?