开发者

Why do you have to explicitly specify scope with friendly_id?

开发者 https://www.devze.com 2022-12-12 05:24 出处:网络
I\'m using the friendly_id gem. I also have my routes nested: # config/routes.rb map.resources :users do |user|

I'm using the friendly_id gem. I also have my routes nested:

# config/routes.rb
map.resources :users do |user|
  user.resources :events
end

So I have URLs like /users/nfm/events/birthday-2009.

In my models, I want the event title to be scoped to the username, so that both nfm and mrmagoo can have events birthday-2009 without them being slugged.

# app/models/event.rb
def Event < ActiveRecord::Base
  has_friendly_id :title, :use_slug => true, :scope => :user
  belongs_to :user

  ...
end

I'm also using has_friendly_id :username in my User model.

However, in my controller, I'm only pulling out events pertinent to the user who is logged in (current_user):

def EventsController < ApplicationController
  def show
    @event = current_user.events.find(params[:id])
  end

  ...
end

This doesn't work; I get the error ActiveRecord::RecordNotFound; expected scope but got none.

# This works
@event = current_user.events.f开发者_JAVA百科ind(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, why do I need to explicitly specify :scope if I'm restricting it to current_user.events anyway? And why does current_user.to_param need to be called explicitly? Can I override this?


I had the exact same problem with friendly_id 2.2.7 but when I updated to friendly_id 3.0.4 in my Rails 2.3.5 app, everything works. I have test all 4 find invocations you mentioned in my app and they work.

Something to take note of are a few API changes that may affect you. The ones I ran into were:

  • :strip_diacritics has been replaced with :strip_non_ascii.

    I decided to switch to Stringex's String#to_url instead by overriding normalize_friendly_id

  • resource.has_better_id? is now !resource.friendly_id_status.best?

  • resource.found_using_numeric_id? is now resource.friendly_id_status.numeric?

0

精彩评论

暂无评论...
验证码 换一张
取 消