我正试图为我的网站生成一些网址'slug'.它基于单个用户生成的文本.
现在,我已经制作了自己的slug方法,所以我不会为此做一些代码.
我想知道的是哪里是最好的地方来确定这个slug是否是唯一的然后插入它因为slug字段是一个唯一的密钥索引.
最初,我在任何插入(对表)上都有一个触发器,所以当输入数据时,然后确定slug.我有一个函数检查包含用户文本(而不是slug)的记录数,然后生成slug并将记录计数+ 1添加到新slug的末尾.
例如.
在表中找到5条记录,其中包含相同的用户生成内容.现在这个slug文本中有一个6加到了最后.
缺陷:如果用户更改其文本,则slug不会更改.
无论如何,我想知道其他人是否已经解决过这个问题,并找到了解决问题的方法?
Django有一个unique_for_date属性,您可以在向模型添加SlugField时设置该属性.这会导致slug仅对您指定的字段的Date具有唯一性:
class Example(models.Model):
title = models.CharField()
slug = models.SlugField(unique_for_date='publish')
publish = models.DateTimeField()
Run Code Online (Sandbox Code Playgroud)
对于像ForeignKey这样的非DateTime字段,实现相同功能的最佳方法是什么?理想情况下,我想做这样的事情:
class Example(models.Model):
title = models.CharField()
slug = models.SlugField(unique_for='category')
category = models.ForeignKey(Category)
Run Code Online (Sandbox Code Playgroud)
这样我就可以创建以下网址:
/example/category-one/slug
/example/category-two/slug
/example/category-two/slug <--Rejected as duplicate
Run Code Online (Sandbox Code Playgroud)
我的想法到目前为止:
将slug和categoryid的唯一索引添加到表中.这需要Django之外的代码.当插入/更新失败时,内置管理员会正确处理吗?
覆盖模型的保存并添加我自己的验证,如果存在重复则抛出错误.我知道这会起作用,但看起来不是很干.
创建一个继承自base的新slug字段,并在那里添加unique_for功能.这似乎是最好的方法,但我查看了核心的unique_for_date代码,并且扩展它似乎不太直观.
有关最佳方法的任何想法,建议或意见?
我希望我的网站网址看起来像这样:
example.com/2010/02/my-first-post
Run Code Online (Sandbox Code Playgroud)
我的Post模型有slug字段('my-first-post')和published_on字段(我们将从中扣除网址中的年份和月份).
我希望我的Post模型是RESTful,所以url_for(@post)像他们应该的工作,即:它应该生成上述url.
有没有办法做到这一点?我知道你需要覆盖to_param并map.resources :posts使用:requirements选项集,但我无法全部工作.
我几乎完成了,我90%在那里.使用resource_hacks插件我可以实现这个目的:
map.resources :posts, :member_path => '/:year/:month/:slug',
:member_path_requirements => {:year => /[\d]{4}/, :month => /[\d]{2}/, :slug => /[a-z0-9\-]+/}
rake routes
(...)
post GET /:year/:month/:slug(.:format) {:controller=>"posts", :action=>"show"}
Run Code Online (Sandbox Code Playgroud)
并在视图中:
<%= link_to 'post', post_path(:slug => @post.slug, :year => '2010', :month => '02') %>
Run Code Online (Sandbox Code Playgroud)
生成适当的example.com/2010/02/my-first-post链接.
我也想这样做:
<%= link_to 'post', post_path(@post) %>
Run Code Online (Sandbox Code Playgroud)
但它需要覆盖to_param模型中的方法.应该相当容易,除了事实,to_param必须返回String,而不是Hash …
我正在创建一个视频网站.我希望我的直接网址看起来像example.com/watch/this-is-a-slug-1,其中1是视频ID.我不希望这个小块很重要.example.com/watch/this-is-another-slug-1应指向同一页面.在SO上,/ questions/id是url中唯一重要的部分.我怎样才能做到这一点?
我正在阅读关于如何在这里建立数据库评论系统的MongoDB教程.一条评论文件包含以下信息:
{
_id: ObjectId(...),
discussion_id: ObjectId(...),
parent_id: ObjectId(...),
slug: '34db/8bda'
full_slug: '2012.02.08.12.21.08:34db/2012.02.09.22.19.16:8bda',
posted: ISODateTime(...),
author: {
id: ObjectId(...),
name: 'Rick'
},
text: 'This is so bogus ... '
}
Run Code Online (Sandbox Code Playgroud)
我似乎无法理解的是什么,slug并且full_slug是,不能从文档的理解.
我正在尝试创建像url一样的stackoverflow.
我以下示例工作正常.但是,如果我删除控制器,那么它会出错.
http://localhost:12719/Thread/Thread/500/slug-url-text
Run Code Online (Sandbox Code Playgroud)
注意第一个Thread是控制器,第二个是动作.
如何使上面的URL看起来如下,从网址中排除控制器名称?
http://localhost:12719/Thread/500/slug-url-text
Run Code Online (Sandbox Code Playgroud)
我的路线
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute("Default", // Route name
"{controller}/{action}/{id}/{ignoreThisBit}",
new
{
controller = "Home",
action = "Index",
id = "",
ignoreThisBit = ""
}); // Parameter defaults )
}
}
Run Code Online (Sandbox Code Playgroud)
线程控制器
public class ThreadController : Controller
{
//
// GET: /Thread/
public ActionResult Index()
{
string s = URLFriendly("slug-url-text");
string url = "Thread/" + 500 + "/" + s;
return RedirectPermanent(url);
}
public ActionResult Thread(int id, …Run Code Online (Sandbox Code Playgroud) 我在放置的功能很少,但是没有按照我想要的方式工作.
根据帖子标题,即时自动创建slug.
示例:如果帖子标题是"测试",那么slug将是"test"
我的问题是,如果他们重复输入帖子标题"测试",这意味着slug也会被复制.出于这个原因,我已经创建了2个函数来为我处理这个问题.
此函数检查数据库中是否存在slug
function slug_exist($x){
global $db;
$sql = "SELECT post_name FROM posts WHERE post_name=\"$x\"";
$query = $db->select($sql);
if($db->num_rows() > 0){
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
如果slug确实存在于数据库中,那么我使用这个函数给slug一个唯一的名字
if(slug_exist($slug)){
$rand = rand(10,50);
$slug = $slug."-".$rand;
return $slug;
}
Run Code Online (Sandbox Code Playgroud)
那么当slug将获得独特的slug名称时,它就像 Example: test-244
我希望slug是按数字顺序而不是随机顺序.
**Example:**
Post Title is "Test"
Slug is "test-1"
Post Title is "Test"
Slug is "test-2"
Post Title is "Test"
Slug is "test-3"
Run Code Online (Sandbox Code Playgroud)
这是我知道如何详细解释的唯一方式,如果您不确定要采取什么,请告诉我.谢谢!
我需要能够控制我的Url.Content("~")调用生成的链接,以便能够在链接的开头接受Slug.基本上托管URL将位于负载均衡器后面,可能位于根级别或更友好的URL后面...
例如:该站点配置为在http:// localhost:5001下运行,因此Url.Content("~/scripts/site.js")将生成"/scripts/site.js"
如果浏览器直接访问该URL或甚至是别名(如www.mysite.com),这都没问题.
但我希望o能够灵活地在www.mysite.com/Slug下托管该网站(想想证书等)......
现在我生成的链接转到www.mysite.com/scripts.site.js,它解析为404.
理想情况下,slug可以配置为自定义IUrlHelper,甚至是自定义LinkGenerator,但我似乎无法注入那些并覆盖当前的.
我试过了:
services.AddScoped<IUrlHelper>(x =>
{
var actionContext = x.GetService<IActionContextAccessor>().ActionContext;
return new MyCustomUrlHelper(actionContext);
});
Run Code Online (Sandbox Code Playgroud)
但无法注入.当我尝试调试时,我注意到如果你在控制器中调用相同的命令,你会得到一个实例Microsoft.AspNetCore.Mvc.Routing.EndpointRoutingUrlHelper.
有没有办法在不创建自定义帮助程序的情况下更改它(因为在某些区域会丢失并且几乎不可能找到被滥用的帮助程序)
你如何处理 DDD 中的 url slug 生成?
内部构造函数?但是依赖其他服务的实体并不好。
Pass as constructor argument? I think slugs shouldnt be there because they are not business requirements. are they?
or just having a setter?
过去,我们通过将页面放入“元”或“子菜单”之类的页面来组织页面树中的页面。这些页面具有“从说 url 中排除”选项,因此它们的名称不会呈现到 url。
在 TYPO3 9.5 中是否有任何选项可以忽略生成“slug”的页面?
例如:
错误:https://www.somedomain.tld/metamenu/terms-and-conditions/
右图:https://www.somedomain。顶级域名/条款和条件/
如何“忽略”页面“元菜单”以自动生成slug?
最好的问候约翰内斯