Why do you have to explicitly specify scope with friendly_id?

Posted by nfm on Stack Overflow See other posts from Stack Overflow or by nfm
Published on 2009-11-25T03:05:42Z Indexed on 2010/05/09 13:08 UTC
Read the original article Hit count: 366

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.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, 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?

© Stack Overflow or respective owner

Related posts about ruby-on-rails

Related posts about friendly-id