【问题标题】:Find_by_slug with Mongoid method undefinedFind_by_slug 与 Mongoid 方法未定义
【发布时间】:2013-07-10 13:21:05
【问题描述】:

我正在使用 Mongoid(3.0.23) 并且我想添加更好的 URL,我关注了 this 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

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 mongoid mongoid3


    【解决方案1】:

    不妨试试:

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

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

     field :slug, type: String
    

    【讨论】:

      【解决方案2】:

      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,我更喜欢直接编写代码。

      【讨论】:

      • 这对我有用 - find_by(slug: params[:id])。简单得多:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多