Почему вы должны явно указывать область действия с помощью friendly_id?
-
22-09-2019 - |
Вопрос
Я использую драгоценный камень friendly_id.У меня также есть вложенные маршруты:
# config/routes.rb
map.resources :users do |user|
user.resources :events
end
Итак, у меня есть URL-адреса типа /users/nfm/events/birthday-2009
.
В моих моделях я хочу, чтобы название события ограничивалось именем пользователя, чтобы оба nfm
и mrmagoo
могут быть события birthday-2009
без того, чтобы их ударили.
# app/models/event.rb
def Event < ActiveRecord::Base
has_friendly_id :title, :use_slug => true, :scope => :user
belongs_to :user
...
end
Я также использую has_friendly_id :username
в моей пользовательской модели.
Однако в моем контроллере я извлекаю события, относящиеся только к пользователю, который вошел в систему (current_user):
def EventsController < ApplicationController
def show
@event = current_user.events.find(params[:id])
end
...
end
Это не сработает;Я получаю сообщение об ошибке 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)
ИТАК, зачем мне нужно явно указывать :scope, если я все равно ограничиваю его current_user.events?И почему current_user.to_param нужно вызывать явно?Могу ли я переопределить это?
Решение
У меня была точно такая же проблема с friendly_id 2.2.7, но когда я обновился до friendly_id 3.0.4 в моем приложении Rails 2.3.5, все работает.Я протестировал все 4 вызова find, которые вы упомянули в моем приложении, и они работают.
Следует обратить внимание на несколько изменений API, которые могут повлиять на вас.Те, с кем я столкнулся, были:
:strip_diacritics
был заменен на:strip_non_ascii
.Я решил переключиться на Stringex's
String#to_url
вместо этого, переопределяяnormalize_friendly_id
resource.has_better_id?
это сейчас!resource.friendly_id_status.best?
resource.found_using_numeric_id?
это сейчасresource.friendly_id_status.numeric?