2017-09-12 8 views
1

ユーザーのプロフィールページにトップユーザーの詳細、すべての投稿の下に表示する。paramsをRails 5のhttp:// localhost:3000/user/adem-balkaのようなフレンドリーなURLから取得する

は私が

if params[:category] 
    @category_id = Category.find_by(title: params[:category]).id 
    @posts = Post.where(category_id: @category_id) 
end 

http://localhost:3000/posts?category=article

のようなURLからのparamを得ることができます知っているが、私はhttp://localhost:3000/user/adem-balka

のようなURLを持っている場合paramが動作しません。

どうすればユーザーを取得できますかそのIDを見つけてそのユーザーIDで投稿を引っ張るには名前を使用しますか?

ありがとうございます。

+0

あなたはこれらの答えの1を受け入れることができます私の問題を解決しましたか?私はあなたが[あなたが答えを受け入れたところで別の質問をしました](https://stackoverflow.com/questions/46180987/rails-5-query-to-pull-posts-from-same-category-other -than-the-post-im-currently)、ここで答えを受け入れることを怠った。 – marcusshep

答えて

0

回答ありがとうございます。私は彼らから

を学んだし、これは

@user_id = User.friendly.find(params[:id]) 
    @posts = Post.where(user_id: @user_id) 
2

URL内のパラメータの名前がルートファイルに設定されています。

config/routes.rbでルートを見ると、ユーザーモデルに対応する行を見つけることができます。それはこのようになります:[:名] 'ADEM-バルカ' に設定されます

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

これは、あなたが/ユーザー/ ADEM-バルカに行けば、paramsをすることを意味します。対応するコントローラー機能のパラメーターにアクセスできます。

1
# routes.rb 
get '/users/:username' => 'users#posts' 


# users_controller.rb 
def posts 
    username = params[:username] 
    # etc.. 
end 

これはルーティングパラメータとしてRails Docsに記載されています。

2

あなたが探しているものは、パスパラメータです(adem-balkaparams[:username]となります)。

パラメータにスラッシュやドットがないと仮定すると、これは経路の一部として/:usernameを追加するのと同じくらい簡単です。

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


# in the controller 
@user = User.find_by(username: params[:username]) 

これはすべてRails Routing from the Outside Inガイドに記載されています。ルートはresourcesを生成することを

注意はすでにあなたのための:idパスパラメータが含まれている(showedit、など)。しかし、コントローラを変更しても、生成されたヘルパー(例:users_path(@user))はIDを使用します。

それが(例えばusers_path(@user)/users/ben代わりの/users/5を与える)が言うusername代わりのidを使用してresourcesで動作させるために、あなたは、例えば、またto_paramメソッドをオーバーライドする必要があります

class User < ApplicationRecord 
    def to_param 
    username #rather than id 
    end 
end 
関連する問題