2011-10-06 63 views
2

我正在學習RoR,我很喜歡我發現的所有東西。我正在從基於PHP的CodeIgniter框架切換,並且在使用redirect_to方法時遇到問題。Rails redirect_to REST

我已經定義了一個基本的用戶模型,我用它來處理註冊 - 數據在數據庫中得到良好存儲,但問題是在將用戶註冊到系統後重定向。

基本上,個人資料頁的格式如下:/用戶/:名稱/:ID

我定義爲這樣一個路線文件:

resources :users 
match '/users/:name/:id', :to => 'users#show' 

這裏是我的創建方法

def create 
    @title = "User creation" 

    @user = User.new(params[:user]) 
    if @user.save 
    info = { :name => @user.name, :id => @user.id } 

    redirect_to info.merge(:action => "show") 
    else 
    @title = 'Sign Up' 
    render 'new' 
    end 
end 

然而,這將產生如下格式的URL:

http://localhost:3000/users/27?name=Testing 

當我實際上是尋找這樣的事情:

http://localhost:3000/users/Testing/27 

是很有道理的,我從那個個人資料頁URL看起來像一個SEO點。我一直在尋找互聯網,但我只找到解決不同問題的辦法。我希望有人能幫幫忙。

已解決 Ryan建議的兩個版本都運行良好,我決定堅持第二個版本,因爲它感覺更加RESTful。我只是分享我現在的配置 - 請注意,用戶模型可能並不完全正確,但它的to_param函數非常重要。此外,我注意到,如果我將私有這個功能合理化,那麼它就不起作用 - 這是有道理的,但我只是認爲我會將其分享給可能遇到此類問題的人。

這是我的路線文件:

resources :users 

這裏是我的用戶模型:

class User < ActiveRecord::Base 
    attr_accessible :name, :email 

    email_regex = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 

    validates :name, 
     :presence => true, 
     :length => { :within => 5..50 } 

    validates :email, 
     :presence => true, 
     :format => { :with => email_regex}, 
     :uniqueness => { :case_sensitive => false } 

    def to_param 
    "#{id}-#{name.parameterize}" 
    end 
end 

,這裏是我的控制器創建功能:

def create 
    @title = "User creation" 

    @user = User.new(params[:user]) 
    if @user.save 
    redirect_to @user 
    else 
    @title = 'Sign Up' 
    render 'new' 
    end 
end 

回答

3

這樣定義您的路線這個:

get '/users/:name/:id', :to => 'users#show', :as => "user" 

然後使用這個幫手重定向到它:

redirect_to(user_path(@user.name, @user.id)) 

或者,你可以只堅持resources :users,而不必定義自己的路線。這裏的區別是,你的路線將是/users/1-testing,而不是users/1/testing,但優點是你會更多的Rails標準。

要做到這一點,在你的模型中定義一個to_param方法,像這樣:

def to_param 
    "#{id}-#{name.parameterize} 
end 

然後Rails會使用to_param方法的輸出在你的路線。

+0

太棒了!正是我需要的。我測試了兩個版本,他們都完美地工作。非常感謝! –