0

我正在使用 Mongoid(3.0.23) 并且我想添加更好的 URL,我遵循了这个 rails cast,但由于某种原因,我的网站对该find_by_slug方法抛出了一个未定义的错误。我已经阅读了一些我可以使用的宝石,但对于这样一个简单的任务来说似乎毫无意义。

模型

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

看法

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

控制器

def show
   @event = Event.find_by_slug!(params[:id])
end
4

2 回答 2

1

也许尝试:

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

另外,不确定是否有必要,但您可以指定类型:

 field :slug, type: String
于 2013-07-10T13:29:15.380 回答
0

Mongoid 定义了属性查找器,但没有定义 bang 版本。

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

无论如何,鉴于 ActiveModel 采用的方式并根据最佳实践,您最好定义模型的所有公共 API。

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

你也可以重复使用 find_by_slug,但正如我所说,因为 ActiveRecord 正在弃用 find_by_attribute,我更喜欢直接编写代码。

于 2013-07-10T13:29:28.703 回答