2017-01-21 18 views
0

IDの代わりに文字列をパラメータとして渡すのに問題があります。私は "id = stack"のポストを見つけることができませんでした。Ruby on Rails - 'id' =文字列でポストが見つかりませんでした

routes.rbは、リダイレクトコントローラで:short_urlのGETリクエストを行います。

get '/:short_url' => 'posts#redirect' 
resources :posts 

post_controller.rbは、投稿のparams [:short_url]を検索しています。

def redirect 
    @post = Post.find(params[:short_url]) 
    redirect_to @post.(params[:url]) 
end 

ビューは単純にアンカータグで、@ post.each do | post |ループ。

<a class="item" target="_blank" href="<%= post.short_url %"> 
     <div>Short URL</div> 
     <%= post.short_url %> 
    </a> 

ルートまたはコントローラレベルでパラメータを誤って呼び出しているかどうかわかりません。

+0

「id」= stackの「stack」は、渡される文字列の単なる例です。 – Dorian

+0

'@post = Post.find_by_short_url(params [:short_url])構文を使用するべきです – djothefou

答えて

3

findメソッドは、id(整数)に基づいてレコードを検索します。他のフィールド(あなたのケースではshort_url)に基づいてテーブルを検索する場合は、find_byメソッドを使用する必要があります。

ActiveRecordが存在しないstackidためpostsテーブルを探しているとあなたはエラーCouldn't find Post with 'id'=stackを取得しています。試してみてください

@post = Post.find_by(short_url: params[:short_url]) 
redirect_to @post 
+0

ありがとうArun!トラブルシューティングのために端末に「puts」を使用し、.findの代わりに.find_byを使用する必要があることを認識しました。それは非常に感謝しています。 – Dorian

関連する問題