Mongoid_slug Rails 4更新/销毁对象

时间:2014-06-17 15:27:29

标签: ruby-on-rails-4 mongoid slug

我在我的rails应用程序中使用mongoig_slug gem。

我可以使用正确的url创建一个对象,但我无法更新/删除该对象,并且我在控制台中没有错误消息。 (我可以编辑包含正确数据的表单)

我甚至使用PRY来检查控制台,当我检查@book退出并且是正确的,如果我做@ book.destroy它说真的但不会破坏。 对于编辑,我还检查了@book,我还检查了book_params,这是正确的。

class Book
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Slug

  field :_id, type: String, slug_id_strategy: lambda {|id| id.start_with?('....')}

  field :name, type: String
  slug :name 
end

class BooksController < ApplicationController
   before_filter :get_book, only: [:show, :edit, :update, :destroy]

   def update
     if @book.update_attributes(book_params)
       redirect_to book_path(@book)
     else
       flash.now[:error] = "The profile was not saved, please try again."
       render :edit
     end
   end

   def destroy
     binding.pry
     @book.destroy
     redirect_to :back
   end

   def book_params
     params.require(:book).permit(:name)
   end

   def get_book
     @book = Book.find params[:id]
   end
end

1 个答案:

答案 0 :(得分:2)

您无法在不更改的情况下复制该行slug_id_strategy: lambda {|id| id.start_with?('....')}。你应该用定义是否为id的东西替换点。

来自docs:

  

此选项应返回响应call(可调用)并接受一个字符串参数的内容,例如一个lambda。如果字符串看起来像你的一个id,那么这个callable必须返回true。

所以,它可能是,例如:

slug_id_strategy: lambda { |id| id.start_with?('5000') } # ids quite long and start from the same digits for mongo.

或:

slug_id_strategy: lambda { |id| =~ /^[A-z\d]+$/ }

或者可能:

slug_id_strategy: -> (id) { id =~ /^[[:alnum:]]+$/ }

<强>更新

最新版本的mongoid_slug已过时,您应该使用github版本。所以在你的Gemfile中:

gem 'mongoid_slug', github: 'digitalplaywright/mongoid-slug'

同时将field: _id行更改为:

  field :_id, type: BSON::ObjectId, slug_id_strategy: lambda { |id| id =~ /^[[:alnum:]]+$/ }

原因_id类型不是字符串,这会发生错误。这应该有用。