6

「投稿」を作成できる Ruby on Rails アプリケーションがあります。まず、足場ジェネレーターを使用して、文字列であるタイトルとコンテンツである本文を生成します。

各「投稿」には、/1、/2、/3 などの ID の URL があります。

/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
4

6 に答える 6

15

Rails はto_paramActiveRecord オブジェクトのメソッドを使用して URL に解決します。

これらの一意の ID (IdGenerator と呼ばれる) を生成する方法があると仮定すると、次のことができます。

1- Post オブジェクトを永続化してデータベースに保存するたびに、この ID を生成します。

class Post < ActiveRecord::Base
  before_create :generate_url_id
  def generate_url_id
    self.url_id = IdGenerator.generate_id
  end
end

2- Post モデル内でto_paramメソッドをオーバーライドします。

class Post < ActiveRecord::Base
  def to_param
    return url_id
  end
end

post_path(@post)/posts/url_id に解決されるようになりました

ちなみに、ID ジェネレーターがまだない場合は、こちらSecureRandom.urlsafe_base64を使用 または参照できます。

to_paramのドキュメントを読んでください。

于 2012-11-19T13:38:05.847 に答える
2

次の 2 つのリソースがお役に立てば幸いです。

  1. obfuscate_idという名前の gem 。次のような形式で ID を表します。

    http://tennisfans.eu/products/4656446465

  2. 別の宝石 - masked_id。同様の機能を提供します。URL 作成の形式を制御し、それをクラスで定義します。ソースを見ると、この gem は obfuscate_id gem の戦略を使用しているようです。

于 2012-11-28T23:03:27.473 に答える
0

Erez manual way の次に、slug として一意の ID を使用して、 Friendly_id gemを使用できます。

class Post < ActiveRecord::Base
  # FriendlyId
  friendly_id :uid

  # Set a unique user id on create
  before_save :set_uid, on: :create

  def set_uid
    self[uid] = rand(36**8).to_s(36)
  end
end

ここでの uid の設定は一意性を保証しないことに注意してください。確かにある種の検証を追加する必要がありますが、そのトピック全体は google とは別のものです。

于 2012-11-19T13:42:14.647 に答える
0

ID 生成に別のオプションが必要な場合は、UUID を使用してみてください。

https://en.wikipedia.org/wiki/Universally_unique_identifier

そして、それらを簡単に生成するための ruby​​ gem:

https://github.com/assaf/uuid

しかし、私は尋ねます: とにかくそれらをランダムにしたいのはなぜですか? ユーザーの 1 人が URL に別の ID を入力して、自分のものではないデータにアクセスすることを避けたい場合は、次のようにファインダーをスコープして、コントローラーでのアクセスを制限することをお勧めします。

def show
    @post = current_user.posts.where(:id => params[:id]).first
    respond_to do |format|
       format.html # show.html.erb
       format.json { render json: @post }
    end
end

この場合、current_user は現在の認証済みユーザーを返す関数です (セッションから、またはアプリケーション ロジックが指示するものは何でも)。

于 2012-12-04T04:55:43.317 に答える
0

次の 3 つの手順に従って、投稿にランダムな URL を与えることができます。

1- モデル (Post.rb) で、保存する前に投稿ごとにランダムな文字列を生成します。例えば、

class Post < ActiveRecord::Base
  before_create :generate_url_id
  def generate_url_id
    self.url_id = SecureRandom.urlsafe_base64
  end
end

2- モデル (Post.rb) で、to_param メソッドを指定して、 Rails のデフォルトの URL 生成をオーバーライドします。例えば:

class Post < ActiveRecord::Base
  def to_param
    self.url_id
  end
end

3-コントローラー(PostsController.rb)で、動的ファインダーを使用して、ランダムな文字列で投稿を見つけます。例えば、

class PostsController < ApplicationController
  def show
    @post = Post.find_by_url_id(params[:id])
    ...
  end
end

先に進み、完全な例をまとめて Github に投稿しました

于 2012-12-06T18:37:05.917 に答える