ger*_*rky 7 friendly-url ruby-on-rails friendly-id ruby-on-rails-3
我使用了带有Rails应用程序的FriendlyId gem(版本4.0.8).我已经按照RailsCasts的教程进行操作,基于文档,我必须Model.find_each(&:save)在rails控制台上运行才能生成旧记录的slugs.但是,当我这样做时,我的所有旧记录的slug属性仍然没有,所以它并没有真正改变url的.
难道我做错了什么?这只发生在生产方式上.它在开发上运行良好.
更新:
我的模型看起来像这样:
class Member < ActiveRecord::Base
extend FriendlyId
friendly_id :name, use: :slugged
belongs_to :gym
attr_accessible :category, :name, :description
validates :category, :name, :description, :presence => true
has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100>" }
def self.search(search)
if search.present?
where("name LIKE ?", "%#{search}%")
else
find(:all)
end
end
def should_generate_new_friendly_id?
new_record?
end
end
Run Code Online (Sandbox Code Playgroud)
tee*_*tee 11
should_generate_new_friendly_id?new_record?由于您的记录已经存在,因此返回false,因为它是false.
删除should_generate_new_friendly_id?方法,或尝试此操作并重新运行:
def should_generate_new_friendly_id?
new_record? || slug.blank?
end
Run Code Online (Sandbox Code Playgroud)
另请参阅:Heroku上的Rails Friendly_Id,Heroku不更新slug
在开发Rails 6应用程序时,我也遇到了同样的挑战。
我是这样解决的:
默认情况下,Friendly_id gem 不会为 Rails 应用程序中的现有记录生成 slugs。因此,如果您有模型的现有记录,则不会为它们生成段数据。它们只会为较新的记录生成。
要为现有记录生成数据块,请执行以下操作。假设我们的模型名称是,Blog并且我们想要用于 slug 的列是title,我们将执行以下操作:
确保首先向Blog表中添加一个 slug 列:
rails g migration AddSlugToBlogs slug:uniq
Run Code Online (Sandbox Code Playgroud)
接下来,生成友好的配置文件和新的迁移(如果您尚未完成):
rails generate friendly_id
Run Code Online (Sandbox Code Playgroud)
接下来,运行数据库迁移:
rails db:migrate
Run Code Online (Sandbox Code Playgroud)
接下来,编辑该app/models/blog.rb文件如下:
class Blog < ApplicationRecord
extend FriendlyId
friendly_id :title, use: :slugged
end
Run Code Online (Sandbox Code Playgroud)
接下来,编辑该app/controllers/blogs_controller.rb文件并将 Blog.find 替换为 Blog.Friendly.find
class BlogController < ApplicationController
def show
@blog = Blog.friendly.find(params[:id])
end
end
Run Code Online (Sandbox Code Playgroud)
或者
class BlogsController < ApplicationController
before_action :set_blog, only: %i[ show edit update destroy ]
def show
end
private
# Use callbacks to share common setup or constraints between actions.
def set_blog
@blog = Blog.friendly.find(params[:id])
end
end
Run Code Online (Sandbox Code Playgroud)
最后,启动 Rails 控制台并运行以下命令来为现有记录生成 slugs:
rails console
Blog.find_each(&:save)
Run Code Online (Sandbox Code Playgroud)
注意:您必须在拥有现有记录的所有环境(例如测试、暂存和生产)中运行此命令,才能为这些环境中的记录生成 slugs。
现在,当您创建一个如下所示的新博客时,标题为“我的第一个博客”,您将能够使用 URL http://localhost:3000/blogs/my-first-blog 访问博客显示页面。
就这样。
我希望这有帮助
| 归档时间: |
|
| 查看次数: |
5047 次 |
| 最近记录: |