Question

I am using Mongoid(3.0.23) and I want to add nicer URL's, I have followed this rails cast but for some reason my site throws an undefined error for the find_by_slug method. I have read about some gems I could use but it seems pointless for such a simple task.

Model

validates :slug, :uniqueness => true

before_validation :generate_url

def generate_url
  self.slug ||= self.title.parameterize if slug.blank?
end 

def to_param
  slug
end

field :slug

View

<% @events.each do |e|  %>
  <%= link_to e.title, event_path(e) %>  
<% end %>

Controller

def show
   @event = Event.find_by_slug!(params[:id])
end
Was it helpful?

Solution

Maybe try:

Event.find_by(slug: params[:id])

Also, not sure if it's necessary but you could specify the type:

 field :slug, type: String

OTHER TIPS

Mongoid defines the attribute finder, but not the bang version.

Event.find_by_slug(params[:id])
# => valid
Event.find_by_slug!(params[:id])
# => not defined

In any case, given the way ActiveModel is taking and according to best practices, it's better for you define all the public API of your model.

class Event
  def self.find_by_slug!(slug)
    where(slug: slug).first || raise(Mongoid::Errors::DocumentNotFound, self, slug: slug)
  end
end

You can also re-use find_by_slug, but as I said, because ActiveRecord is deprecating find_by_attribute, I prefer to write the code directly.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top