質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

2137閲覧

ハッシュ化したidを取り出しテストを実行したい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2019/06/11 11:23

class Product < ApplicationRecord include Hashid::Rails end

routes.rb

Rails.application.routes.draw do root to: 'homes#top' devise_for :users, controllers: { confirmations: 'users/confirmations', passwords: 'users/passwords', registrations: 'users/registrations', sessions: 'users/sessions' } resources :users, only: %i(show) resources :products end

以上のようにユーザーにProductのidを知られないようにgem'hashid-rails'を使用しているのですが、Rspecのテスト時にエラーが起きてしまいます。

describe "GET #show" do context "when at login" do before do sign_in(@user) @product = FactoryBot.create(:product) end it "returns 200 response" do product_hash_id = @product.to_param get :show, params: { hashid: product_hash_id } expect(response).to have_http_status 200 end end end

上記のような記述ですが、

1) ProductsController GET #show when at login returns 200 response Failure/Error: get :show, params: { hashid: product_hash_id } ActionController::UrlGenerationError: No route matches {:action=>"show", :controller=>"products", :hashid=>"pJ0uaX"} # ./spec/controllers/products_controller_spec.rb:100:in `block (4 levels) in <main>' # -e:1:in `<main>'

とエラーが出てしまいます。

id: product_hash_id と記述した場合

Failure/Error: @product = Product.find(params[:hashid]) ActiveRecord::RecordNotFound: Couldn't find Product without an ID

product: product_hash_id と記述した場合

ActionController::UrlGenerationError: No route matches {:action=>"show", :controller=>"products", :product=>"Ekbunp"}

この場合の記述を教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

テスト以外ならば通るのでしょうか?
hashid-railsを読んだ限りだとエラーになる気がします。

@product = Product.find(params[:hashid])

ruby

1@product = Product.find(params[:id]) 2@product = Product.find_by_hashid!(params[:id])

まぁ、どっちかだと思います。

投稿2019/06/11 14:07

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/11 14:46

@product = Product.find(params[:id]) でそのままでできました!
asm

2019/06/11 15:03

find(params[:id])の場合は ハッシュ化されてないIDを渡した場合も動作する点に注意が必要な場合もあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問