2012-11-23 96 views
1

我有一個Ruby on Rails應用程序,您可以在其中創建'posts'。我開始使用腳手架生成器來生成標題,這是一個字符串,而內容是主體。在Ruby on Rails中更改參數[:id]

每個「交」具有ID的URL,例如,/ 1,/ 2,/ 3等

是否有一種方法來改變它的generater隨機字符和數字的字符串,用於例如/ 49slc8sd,/ l9scs8dl等?

以下是我對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 

這裏是我在post.rb模型

class Document < ActiveRecord::Base 
    attr_accessible :content, :name 
end 
+1

您能否重新解釋一下這個問題?我不確定你在問什麼。這可能意味着六十件事情(我可以​​從頭頂開始思考)。 – omninonsense

+0

我已經爲你改寫過。希望它更有意義。 – user1658756

回答

0

目前還不清楚你問這裏。路由中指定的動作路徑不要求傳遞的ID具有特定的格式。你可以傳遞非數字的ID,如果你想和你的動作一樣使用你想要的ID。也許如果你提供了關於路線和行動的更多信息,我們可以理解你所要求的。

+0

一點都不清楚(他在問什麼) – Agush

+0

我已經爲你改寫了它。希望它更有意義。 – user1658756

1

如果你希望你的模型不要有其主鍵ID可預測的順序,你可以但是你也可以根據航線上的任何基於uuid或用東西幫助像http://codesnipers.com/?q=using-uuid-guid-as-primary-key-in-rails

的GUID ID唯一標識這是推薦的方法,如果萬一你不想暴露數據庫標識符在你的路由

person/:person_random_token, :controller => :persons, :action => :show #adding this in your route file directing to the controller where you can use params[:person_random_token] to uniquely identify your person object in Persons model 

在你的控制器的操作的資源的其他財產,你可以說

Person.find_by_random_token(params[:person_random_token]) #assuming random_token is your column name 

得到Person對象

0

還有a number of ways如何在Ruby中生成隨機字符串。

現在,到您的問題的第二部分。如果你想要使用像/post/rndm5tr的路線來訪問你的帖子,你可以簡單地改變這行代碼的控制器內:

@post = Post.find(params[:id]) 

@post = Post.find_by_randomness(params[:id]) 

現在,只需創建一個遷移:rails g migration AddRandomnessToPost randomness:string和運行rake db:migrate(或bundle exec rake db:migrate,取決於它的設置)。

當然,您可以隨意命名該字段,randomness只是我使用的隨機名稱。我認爲常見的慣例是稱它們爲slu or或代幣,但我可能是錯的。

現在,在你的模型中添加一個方法before_create生成隨機字符串,並將其添加到即將被保存的Post對象(使用從上面的鏈接一個例子)。檢查你生成的字符串是否已經被使用是明智的(你可以編寫一個遞歸方法,如果一個帖子已經有隨機標記,它會再次調用它自己)。

1

您還應該知道ActiveRecord :: Base對象的to_param方法。

基本上,Rails在你的對象上調用這個方法來知道要在URL和params [:id]中放置什麼。默認情況下,它只是數據庫中記錄的主鍵。假設你覆蓋它:

class Post < ActiveRecord::Base 

    def to_param 
    return id*100 
    end 

    def self.find_by_new_id(n) 
    return self.find(n/100) # really you'd want to handle strings and integers 
    end 
end 

數據庫中的第一條記錄將有url /posts/100

在你的控制器,以獲取你只是做對象

@post = Post.find_by_new_id(params[:id]) 

(當然你可以覆蓋默認find方法爲好,但可能是令人難以接受的。)基本上to_param方法將你的ID新的發現者將其解除。通常,您只需指向創建記錄時通過鉤子自動填充的另一個數據庫列。這是Qumara otBurgas發佈的鏈接中描述的內容。