Ruby on Rails的URL格式
Ruby on Rails的URL格式
我有一个 Ruby on Rails 应用程序,你可以在其中创建“帖子”。我最初使用脚手架生成器来生成标题和内容。每个“帖子”的url都是其 ID,例如/1、/2、/3等等。是否有一种方法可以将其更改为随机字符的字符串,例如/49sl、/l9sl等等?
更新
这是我在“posts_controller.rb”中的代码
class PostsController < ApplicationController # GET /posts # GET /posts.json def index @posts = Post.all respond_to do |format| format.html # index.html.erb format.json { render json: @posts } end end # GET /posts/1 # GET /posts/1.json def show @post = Post.find(params[:id]) respond_to do |format| format.html # show.html.erb format.json { render json: @post } end end # GET /posts/new # GET /posts/new.json def new @post = Post.new respond_to do |format| format.html # new.html.erb format.json { render json: @post } end end # GET /posts/1/edit def edit @post = Post.find(params[:id]) end # POST /posts # POST /posts.json def create @post = Post.new(params[:post]) respond_to do |format| if @post.save format.html { redirect_to @post, notice: 'Post was successfully created.' } format.json { render json: @post, status: :created, location: @post } else format.html { render action: "new" } format.json { render json: @post.errors, status: :unprocessable_entity } end end end # PUT /posts/1 # PUT /posts/1.json def update @post = Post.find(params[:id]) respond_to do |format| if @post.update_attributes(params[:post]) format.html { redirect_to @post, notice: 'Post was successfully updated.' } format.json { head :no_content } else format.html { render action: "edit" } format.json { render json: @post.errors, status: :unprocessable_entity } end end end # DELETE /posts/1 # DELETE /posts/1.json def destroy @post = Post.find(params[:id]) @post.destroy respond_to do |format| format.html { redirect_to posts_url } format.json { head :no_content } end end end
。
admin 更改状态以发布 2023年5月23日
我希望这两个资源能够帮到你:
-
那就是名叫obfuscate_id的gem。它以以下类似格式表示ID:
-
另一个gem——masked_id,提供了类似的功能。您可以通过在类中定义创建URL的格式来控制它。从源代码看,这个gem似乎使用了obfuscate_id gem的策略。
Rails使用ActiveRecord对象的to_param
方法将其解析为URL。\n假设您有一种方法来生成这些唯一的ID(将其称为IdGenerator),您可以执行以下操作:\n1- 每当您持久化一个Post对象并将其保存到数据库中时,生成此ID,假设它在url_id列下。\n
class Post < ActiveRecord::Base before_create :generate_url_id def generate_url_id self.url_id = IdGenerator.generate_id end end
\n2- 在您的Post model中覆盖to_param
方法:\n
class Post < ActiveRecord::Base def to_param return url_id end end
\n现在post_path(@post)
将解析为/posts/url_id。\n顺便说一句,如果您还没有ID生成器,可以使用SecureRandom.urlsafe_base64
或查看此处。\n在to_param文档中阅读更多信息。