Module: FriendlyId::Finders
- Defined in:
- lib/friendly_id/finders.rb
Overview
## Performing Finds with FriendlyId
FriendlyId offers enhanced finders which will search for your record by friendly id, and fall back to the numeric id if necessary. This makes it easy to add FriendlyId to an existing application with minimal code modification.
By default, these methods are available only on the ‘friendly` scope:
Restaurant.friendly.find('plaza-diner') #=> works
Restaurant.friendly.find(23) #=> also works
Restaurant.find(23) #=> still works
Restaurant.find('plaza-diner') #=> will not work
### Restoring FriendlyId 4.0-style finders
Prior to version 5.0, FriendlyId overrode the default finder methods to perform friendly finds all the time. This required modifying parts of Rails that did not have a public API, which was harder to maintain and at times caused compatiblity problems. In 5.0 we decided to change the library’s defaults and add the friendly finder methods only to the ‘friendly` scope in order to boost compatiblity. However, you can still opt-in to original functionality very easily by using the `:finders` addon:
class Restaurant < ActiveRecord::Base
extend FriendlyId
scope :active, -> {where(:active => true)}
friendly_id :name, :use => [:slugged, :finders]
end
Restaurant.friendly.find('plaza-diner') #=> works
Restaurant.find('plaza-diner') #=> now also works
Restaurant.active.find('plaza-diner') #=> now also works
### Updating your application to use FriendlyId’s finders
Unless you’ve chosen to use the ‘:finders` addon, be sure to modify the finders in your controllers to use the `friendly` scope. For example:
# before
def set_restaurant
@restaurant = Restaurant.find(params[:id])
end
# after
def set_restaurant
@restaurant = Restaurant.friendly.find(params[:id])
end
#### Active Admin
Unless you use the ‘:finders` addon, you should modify your admin controllers for models that use FriendlyId with something similar to the following:
controller do
def find_resource
scoped_collection.friendly.find(params[:id])
end
end
Defined Under Namespace
Modules: ClassMethods
Class Method Summary collapse
Class Method Details
.setup(model_class) ⇒ Object
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/friendly_id/finders.rb', line 76 def self.setup(model_class) model_class.instance_eval do relation.class.send(:include, friendly_id_config.finder_methods) if (ActiveRecord::VERSION::MAJOR == 4 && ActiveRecord::VERSION::MINOR == 2) || ActiveRecord::VERSION::MAJOR >= 5 model_class.send(:extend, friendly_id_config.finder_methods) end end # Support for friendly finds on associations for Rails 4.0.1 and above. if ::ActiveRecord.const_defined?("AssociationRelation") model_class.extend(ClassMethods) association_relation_delegate_class = model_class.relation_delegate_class(::ActiveRecord::AssociationRelation) association_relation_delegate_class.send(:include, model_class.friendly_id_config.finder_methods) end end |