Alrighty, Sal. Let’s take a look.

- First up, let’s look at the stack trace more closely. We’re getting an error 
inside the #find_for_authentication method in your User model.

- So let’s go look at the User model. As the name implies, 
#find_for_authentication is used to find the first matching active user when we 
need to authenticate a user (to login, etc.) This is a common pattern for auth 
code because when a user logs in, we only want to be dealing with a single 
account (even if they have somehow created more than one account with the same 
email address). That way, whenever you need to interact with the current_user, 
there’s only one — and you don’t have to write code like `if current_user && 
current_user.size == 1`.

- Another observation: you've defined this method, but you’re not explicitly 
using it within your model. So, while it’s possible that this method is only 
used in a controller, it made me think you might be redefining a method 
originally defined by your auth gem.

And, indeed, a quick search for the method name reveals that the method belongs 
to Devise: 
https://www.rubydoc.info/github/plataformatec/devise/Devise/Models/Authenticatable/ClassMethods

- But, back to the stacktrace and model for a second: the method is trying to 
find the first active user (using the :email param), but it’s failing. But look 
at it closely. Line 77 is just an ActiveRecord finder. It’s essentially 
`User.find(:first, :conditions)`.

- So now let’s look at the docs for ActiveRecord in Rails 2.3:
https://guides.rubyonrails.org/v2.3.11/active_record_querying.html

- Scroll down to section 1.1.2:
`Model.find(:first, options) is equivalent to Model.first(options)`

- That’s the same ActiveRecord finder your code is using!

- So now let’s look at these same docs in Rails 5.2:
https://guides.rubyonrails.org/active_record_querying.html

- There is no mention of using the :first param with #find. And that’s because 
later versions of Rails switched to `User.first`.

So I think that’s the source of your error. User.find(:first) is no longer 
support in Rails.

To get things working, you would just need to update your ActiveRecord syntax 
to work with Rails 5.2.

def self.find_for_authentication(conditions={})
  first.where(conditions, active: true)
end

But, even simpler, if you look at those Devise docs again, the sample code for 
customizing #find_for_authentication has changed a bit:

def self.find_for_authentication(tainted_conditions)
  find_first_by_auth_conditions(tainted_conditions, active: true)
end

It’s using a different ActiveRecord syntax — presumably still valid -- for 
finding that first record, so that’s an option too.

And remember: as you do this upgrade, you’re upgrading Ruby code, Ruby on Rails 
code, and, in this case, Devise code — so you want to make sure that’s current 
too.

Also, as we discussed in person, I recommend creating a separate, brand-new 
Rails 5.2 app as you work on the upgrade. You can use that as a test bed for 
getting working 5.2 code in a completely clean code base with zero legacy 
issues.

So, for instance, it might be worth building out a new Devise implementation 
for basic authentication in this separate 5.2 app, and then once it’s all 
working, backport the new auth code into the old app.

Good luck!

Cheers,
Patrick



> On Aug 9, 2018, at 6:23 pm, Salvatore McCarty <[email protected]> wrote:
> 
> 
> Hi Ben, 
> 
> I've attached a PDF of the trace and here's a link to a gist with the Gemfile 
> (and .lock) and the user.rb file that the trace points to.
> https://gist.github.com/SalMac86/6dc23b6fe9a090bc12024de3fa723957
> 
> Thanks!, 
> 
> Sal
> On Thursday, August 9, 2018 at 4:07:06 PM UTC-7, Benjamin Wanicur wrote:
> Hi Sal
> 
> Can you post the error stacktrace and some code ?  Or create a Gist ?
> 
> On Thu, Aug 9, 2018 at 2:00 PM Salvatore McCarty <[email protected]> wrote:
> Hello, 
> 
> It was great meeting all of you and attending the event last Thursday.
> 
> I am still in the midst of the upgrade of that inherited project from Rails 
> 3.2 to 5.2 and would greatly appreciate any help!
> 
> Right now it seems like something in the controllers has changed, and I'm 
> getting an invalid number of arguments error for just about everything.
> 
> If anyone wants to connect with me and maybe take a peek, I would be grateful!
> 
> Best, 
> 
> Sal
> 
> -- 
> -- 
> SD Ruby mailing list
> [email protected]
> http://groups.google.com/group/sdruby
> --- 
> You received this message because you are subscribed to the Google Groups "SD 
> Ruby" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
> 
> -- 
> -- 
> SD Ruby mailing list
> [email protected]
> http://groups.google.com/group/sdruby
> --- 
> You received this message because you are subscribed to the Google Groups "SD 
> Ruby" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
> <Action Controller_ Exception caught.pdf>

-- 
-- 
SD Ruby mailing list
[email protected]
http://groups.google.com/group/sdruby
--- 
You received this message because you are subscribed to the Google Groups "SD 
Ruby" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to