diff --git a/activerecord/lib/active_record/signed_id.rb b/activerecord/lib/active_record/signed_id.rb index a553e3d2f47b7c2420d9d4ddb58ab29b05073403..abd7ddf37e9ab8e71b45f235ab28925d33c0ffcf 100644 --- a/activerecord/lib/active_record/signed_id.rb +++ b/activerecord/lib/active_record/signed_id.rb @@ -40,8 +40,10 @@ module ClassMethods # travel_back # User.find_signed signed_id, purpose: :password_reset # => User.first def find_signed(signed_id, purpose: nil) + raise UnknownPrimaryKey.new(@klass) if primary_key.nil? + if id = signed_id_verifier.verified(signed_id, purpose: combine_signed_id_purposes(purpose)) - find_by id: id + find_by primary_key => id end end diff --git a/activerecord/test/cases/signed_id_test.rb b/activerecord/test/cases/signed_id_test.rb index 0b963220c058494a605be4241f2aa52830f14757..9933401ebe83d0834100ade79399c34c32b9d758 100644 --- a/activerecord/test/cases/signed_id_test.rb +++ b/activerecord/test/cases/signed_id_test.rb @@ -3,20 +3,35 @@ require "cases/helper" require "models/account" require "models/company" +require "models/toy" +require "models/matey" SIGNED_ID_VERIFIER_TEST_SECRET = "This is normally set by the railtie initializer when used with Rails!" ActiveRecord::Base.signed_id_verifier_secret = SIGNED_ID_VERIFIER_TEST_SECRET class SignedIdTest < ActiveRecord::TestCase - fixtures :accounts + fixtures :accounts, :toys - setup { @account = Account.first } + setup do + @account = Account.first + @toy = Toy.first + end test "find signed record" do assert_equal @account, Account.find_signed(@account.signed_id) end + test "find signed record with custom primary key" do + assert_equal @toy, Toy.find_signed(@toy.signed_id) + end + + test "raise UnknownPrimaryKey when model have no primary key" do + assert_raises(ActiveRecord::UnknownPrimaryKey) do + Matey.find_signed("this will not be even verified") + end + end + test "find signed record with a bang" do assert_equal @account, Account.find_signed!(@account.signed_id) end