Hi Sal!

I just completed a Rails 3 to 5 upgrade myself. One general piece of advice 
is that the Ruby on Rails Upgrade Guide 
<https://guides.rubyonrails.org/upgrading_ruby_on_rails.html> is hugely 
helpful. If you haven't already, I'd recommend reading through the "General 
Advice" section, reading through the specific section related to the 
versions you're upgrading from and to, and referring back to it often.

I'm sure there are many ways to approach a Rails upgrade, but following 
"1.2 The Upgrade Process" from the guide was very helpful for me:

When changing Rails versions, it's best to move slowly, one minor version 
> at a time, in order to make good use of the deprecation warnings.


That means if your app is on 3.2.x right now, I'd highly recommend first 
working to get your app to 4.0.13, and only after you've addressed all the 
deprecation warnings, getting your app to 4.1.16, then 4.2.10, etc.

Good luck! The process can definitely be a slog at times, but it will feel 
great when you're able to take advantage of some of the great new features 
in newer versions of Rails.

- Nick
 
On Friday, August 10, 2018 at 12:16:03 PM UTC-4, Salvatore McCarty wrote:
>
> Hi Patrick,
>
> That was immensely helpful. I did take your advice, and have a fresh Rails 
> 5.2 app to test with. 
>
> I may be in touch if I find myself intractably stuck again, but I believe 
> you've got me pointed back in the right direction!
>
> Best,
>
> Salvatore
>
> On Fri, Aug 10, 2018, 8:30 AM Patrick Crowley <pat...@mokolabs.com 
> <javascript:>> wrote:
>
>> 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 <s...@everydev.com 
>> <javascript:>> 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 <s...@everydev.com> 
>> 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
>> > sdr...@googlegroups.com
>> > 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 sdruby+un...@googlegroups.com.
>> > For more options, visit https://groups.google.com/d/optout.
>> > 
>> > -- 
>> > -- 
>> > SD Ruby mailing list
>> > sdr...@googlegroups.com <javascript:>
>> > 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 sdruby+un...@googlegroups.com <javascript:>.
>> > For more options, visit https://groups.google.com/d/optout.
>> > <Action Controller_ Exception caught.pdf>
>>
>> -- 
>> -- 
>> SD Ruby mailing list
>> sdr...@googlegroups.com <javascript:>
>> 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 sdruby+un...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>

-- 
-- 
SD Ruby mailing list
sdruby@googlegroups.com
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 sdruby+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to