2016-10-19 14 views
1

私はHartlのチュートリアルを完了し、Twitterのクローンと同じ方法でバニティURLを作成しようとしています。 www.twitter.com/realDonaldTrump/users /:の代わりにルートルート/名前

URLを/ users /:slugのようにすることができました。 ワンダーリング - どうすれば入手できますか?/:スラッグですか?

1.In私のUserモデルは、「ユーザ名」には列がありませんので、私が代わりに「名前」を使用:

は、ここで私がこれまで行ってきたものです。

2.ユーザーモデルDBにスラグ列を追加するための新しい移行。レールコンソールに

3.Pluggedは、次のように入力して、すべてのユーザーのためのナメクジを追加します。

User.all.each do |user| 
    user.slug = user.name.downcase.parameterize 
    user.save 
end 

4.ConfiguredがUserController showアクションへ:今

def show 
    @user = User.find_by_slug(params[:id]) 
    @microposts = @user.microposts.paginate(page: params[:page]) 
    redirect_to root_url and return unless @user.activated? 
end 

私はそれを設定したことをそのようにshows/users /:slug、どうすれば変更できますか?/:slug?

+0

私はプロファイルページ/ chloe-schambergerを訪れることができますが、うまく動作していると思われる 'get '/:id'、to: 'users#show'' – Sravan

+0

にroueを変更してください。しかし、今私は私のページの他のどれにも行けません。 nilのための 未定義のメソッド 'マイクロポスト:私はエラーを取得するNilClass DEF @user = User.find_by_slug(のparams [:IDを])を示し @microposts = @ user.microposts.paginate(ページ:のparams [:ページ]) root_urlにredirect_toして、@ user.activatedを除いて返されますか? end – doctopus

+0

/users、/ help、/ aboutな​​どのコレクションページを訪問するたびに、ルートは次のように考える:id = users。これをどうやって解決するのですか? – doctopus

答えて

1

は、ユーザーにこの......

編集アプリ/モデル/ user.rb

class User < ActiveRecord::Base 
    extend FriendlyId 
    friendly_id :name, use: :slugged 
end 

User.create! name: "Username" 

変更User.findをお試しください。フレンドリー。既存のアプリにFriendlyIdを追加し、既存のユーザーのナメクジを生成する を必要としている場合

User.friendly.find(params[:id]) 

rails server 

http://localhost:3000/users/username 

をあなたのコントローラで見つけ、 コンソールからこれを行うには、ランナー、またはrakeタスクを追加します。

User.find_each(&:save) 

をyで

...これを試してみてください代わりに/ユーザー/ユーザー名の/ユーザ名を取得するには私たちのユーザーモデルは、

class User < ActiveRecord::Base 
    ... 
    def to_param 
    name 
    end 
    ... 
end 

を追加します。しかし、あなたのコントローラであなたの名前でユーザを見つけてください。お使いのコントローラで

ユーザーをルーティングするためとして

class UsersController < ApplicationController 
    ... 
    def show 
    @user = User.find_by(name: params[:id]) 
    end 
end 

を追加する/ユーザー名、あなたはいくつかのオプションがあります:

get ':id', to: 'users#show', as: 'show' 
resources 'users', path: '/' 

ちょうどあなたがあなたのルートファイルの末尾にこれらのルートを置くことを確認し。

これがうまくいくと思います。

+0

これはフレンドリーなID宝石が必要ですか?また、私は/ users/usernameの代わりに/ usernameを取得しようとしています。 – doctopus

+0

@JosephLiu:はい、これは 'gem 'friendly_id''を必要とします。 –

+0

@JosephLiu:私は自分の答えを更新しました。ありがとう! –

1

get '/:slug', to: 'users#show' 

を使用してルートを変更

し、あなたがUserControllerに

def show 
    @user = User.find_by slug: params[:slug] 
... 
end 

を削除することを忘れないでください: before_actionの 'ショー' を:SET_USER、のみ:[:ショー、:あなたのコントローラーの は "set_user"として使用します:idではなく:スラッグでインスタンスを取得する

スラッグのユニークさを心配する必要があることに注意してくださいモデル内のSS

before_validation :set_slug  
validates :slug, uniqueness: true 

private 

def set_slug 
... 
end 
0

get '/:slug', to: 'users#show'を保存するこの最後のルートとチェックします。

私たちが作成した名前付きルートなので、他のルートが妨げられないように、最後に配置する必要があります。あなたのUsers Controller

def show 
    @user = User.find_by slug: params[:slug] 
end 
+0

get '/:slug'では動作しないようですが、 '/:id'で動作します。これにはどんな理由がありますか? – doctopus

+0

また、一部のページは機能していないようです(たとえば、フォロワーページなど)。 @user = User.find(params [:id])をUser.find_by_slug(params [:id])と置き換えなければならないからです。 – doctopus

+0

最後に保管したときに '/:id'を使って作業していますか? – Sravan

関連する問題