我在我的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
答案 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
类型不是字符串,这会发生错误。这应该有用。