2016-12-13 17 views
1

は1レールカスタマイズするには、ユーザーのためのルートのレール - レール4

http://www.example.com/users/5/ian

に、このようなURLを取得する方法を私に助言することができ、私は以下のが、わからないを試してみました:

route file: 
devise_for :users 
    resources :users do 
    resources :socials 
    end 
    get '/users/:id/:firstname', controller: 'users', action: 'show' 

users_controller.rb

def show 
    @user = User.find(params[:id], params[:firstname]) 
    end 
+0

routes.rbの設定結果を確認したい場合は、端末から 'rake routes'を使うだけです。生成されたすべてのルートが表示されます。 – David

+0

なぜあなたはIDとユーザー名の両方を使いたいのですか? – max

答えて

1

を:

あなたは特別なルートを作成する必要はありません。

get '/users/:id', controller: 'users', action: 'show' 

代わりに、あなたのモデルがto_paramメソッドを上書きします:

class User 
    ... 
    def to_param 
    "#{id}-#{firstname.try(:parameterize)}" 
    end 
    ... 
end 

URLヘルパーは、URLを構築するためにto_paramを呼び出します。あなたはこのようにそれを上書きする場合は、このようなURLが送信されます:[:ID]

http://localhost:3000/users/1-artloe 

レールは方法がのparamsに.to_i呼び出す見つけ、ありがたいことに、数として文字列を解釈し、それが文字に到達するまで数字にはならない。

例:

'123abcde'.to_i # 123 
'123-asdf'.to_i # 123 
'asdf-123'.to_i # 0 

のでto_paramを上書きを除き、あなたは何もする必要はありません。

+0

'firstname'がURLセーフであることを確認してください。多くのロケールでは、ファーストネームはその中にスペースを含む複合名とすることができます。だから、OPは本当に驚くほど難しいスラッギングに関連する難しい質問を解決するFriendlyIdとStringexを見なければならないのです。 – max

1

何を達成しようとしていることであるならば
def show 
    @user = User.find_by_id_and_firstname(params[:id], params[:firstname]) 
end 
1

「友好のURLは、」あなたはそれで行うだろう:あなたはURLで使用されるプロパティを確認する必要がありますしかし

# GET /users/1 
# GET /users/joe 
def show 
    @user = User.find_by!('id = :x OR firstname = :x', x: params[:id]) 
end 

が安全かつユニークなURLです。通常、別のユーザー名またはスラッグフィールドが使用されます。 経路に関して特別なものは必要ありません。

これらの宝石は "友好のURL" を提供:あなたは 'フレンドリーなURL' を達成しようとしているなら、私はこれを使用することをお勧めし

関連する問題