如果我创建@slug = Slug.url =“foo”
当我去保存时,如果“foo”的Slug.url已经存在,我想尝试一个“foo-1”的Slug.url如果它也存在,试试“foo-2”foo-3,foo -4等等……直到找到一个不存在且可以在db中创建的值…在我的rails模型中,这是什么样的正确方法?
谢谢
更新:
我的最新代码如下所示:
def set_url self.url = self.title.parameterize # Ensure the url is available qUrl = self.url.split('-').shift slugs = Slug.where("url like '#{qUrl}%'") if slugs.exists? c = slugs.count + 1 self.url = self.url + "-" + c.to_s end end
这个代码的问题是qUrl正在拾取误报,任何时候标题都以“为什么”找到slugs这个词开头.在这里会有一些帮助,想出一些更可靠和优雅的东西.谢谢
解决方法
1. Slug模型
使用friendly_id
的sequentially_slugged
模块,该模块在保存记录时(特别是在before_validation回调期间)从唯一列生成按顺序排序的段塞.
在新目录中启动一个新的Rails项目:
rails new .
将friendly_id添加到Gemfile(并在之后运行bundle install):
gem 'friendly_id'
使用迁移(运行rake db:migrate after),db / migrate / 20170114211811_create_slugs.rb生成slugs表模式:
class CreateSlugs < ActiveRecord::Migration def change create_table :slugs do |t| t.string :url t.string :title end add_index :slugs,:url,unique: true add_reference :slugs,:item,polymorphic: true,index: true end end
使用friendly_id,app / models / slug.rb创建一个Slug模型:
class Slug < ActiveRecord::Base extend FriendlyId friendly_id :title,use: :sequentially_slugged,slug_column: :url belongs_to :item,polymorphic: true end
2. Slug路由控制器
您的用例要求单个根路由(例如,/ this-is-my-x).
配置/ routes.rb文件:
Rails.application.routes.draw do get ':url' => 'slugs#show' end
要从此单个Slug路径中提供多个模型,您可以让Slug Controller将其渲染操作委派给与所选Slug关联模型相对应的View.
应用程序/控制器/ slugs_controller.rb:
class SlugsController < ApplicationController def show @item = Slug.find_by(url: params[:url]) render "#{@item.item_type.pluralize.underscore}/show" end end
3. Sluggable模型视图
最后,开始使用多个模型中的单个Slug.
rails generate model article title:string
应用程序/模型/ article.rb:
class Article < ActiveRecord::Base has_one :slug,as: :item before_validation do if slug.try(:title) != title self.slug = Slug.create(title: title) end end end
应用程序/视图/文章/ show.html.erb:
<h1>Articles#show</h1> <p>Title is <%=@item.title%>,ID is <%=@item.id%></p>
4.测试
在rails控制台中创建一些文章:
(1..10).each { Article.create title: 'foo' }
测试你的slug(运行rails服务器,并访问localhost:3000 / foo-7):
Articles#show Title is foo,ID is 7
全部完成!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。