Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

undefined method `translations' for nil:NilClass when using finders #282

Closed
astudnev opened this issue Oct 21, 2013 · 7 comments
Closed

Comments

@astudnev
Copy link

When trying to use finders as find_by or find_by_name globalize fires exception in case when the record not found, for example:

Realm.create name: 'aa'

-> created an instance OK

Realm.find_by_name 'aa' -> OK
SQL (0.2ms) SELECT DISTINCT realms.id FROM realms LEFT OUTER JOIN realm_translations ON realm_translations.realm_id = realms.id WHERE realm_translations.name = 'aa' AND realm_translations.locale = 'ru' AND (realm_translations.name IS NOT NULL) LIMIT 1
SQL (0.1ms) SELECT realms.id AS t0_r0, realms.name AS t0_r1, realms.default_locale AS t0_r2, realms.default_time_zone AS t0_r3, realms.created_at AS t0_r4, realms.updated_at AS t0_r5, realm_translations.id AS t1_r0, realm_translations.realm_id AS t1_r1, realm_translations.locale AS t1_r2, realm_translations.created_at AS t1_r3, realm_translations.updated_at AS t1_r4, realm_translations.name AS t1_r5 FROM realms LEFT OUTER JOIN realm_translations ON realm_translations.realm_id = realms.id WHERE realm_translations.name = 'aa' AND realm_translations.locale = 'ru' AND realms.id IN (1) AND (realm_translations.name IS NOT NULL)
Realm::Translation Load (0.2ms) SELECT realm_translations.* FROM realm_translations WHERE realm_translations.realm_id = 1

<Realm id: 1, name: "aa", default_locale: "RU", default_time_zone: "aa", created_at: "2013-10-21 10:31:50", updated_at: "2013-10-21 10:31:50">

Realm.find_by_name 'aa1' -> NOT OK
SQL (0.4ms) SELECT DISTINCT realms.id FROM realms LEFT OUTER JOIN realm_translations ON realm_translations.realm_id = realms.id WHERE realm_translations.name = 'aa1' AND realm_translations.locale = 'ru' AND (realm_translations.name IS NOT NULL) LIMIT 1
NoMethodError: undefined method translations' for nil:NilClass from (eval):4:inblock in take'
from (eval):2:in tap' from (eval):2:intake'
from /Users/q/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-4.0.0/lib/active_record/relation/finder_methods.rb:48:in find_by' from /Users/q/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-4.0.0/lib/active_record/dynamic_matchers.rb:76:infind_by_name'
from (irb):25
from /Users/q/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands/console.rb:90:in start' from /Users/q/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands/console.rb:9:instart'
from /Users/q/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands.rb:64:in <top (required)>' from /Developer/site/sources/project/bin/rails:4:inrequire'
from /Developer/site/sources/project/bin/rails:4:in <top (required)>' from -e:1:inload'
from -e:1:in `

'

When using

Realm.where name: 'qq'

Realm.where(name: 'qq' ) -> OK
Realm.where(name: 'qq' ).first -> error

NoMethodError: undefined method `translations' for nil:NilClass

@astudnev
Copy link
Author

Realm.where(name: 'qq' ) -> OK
Realm.where(name: 'qq' ).first -> error

@shioyama
Copy link
Contributor

This is not documented yet, but the dynamic finders have been deprecated in Rails 4 so we've taken them out of globalize 4.0.0. However in their place we've added functionality to activerecord relations to handle translations, so Post.where(title: 'a title').first should work, if you're getting a nil:NilClass error that's a bug.

If you can provide more details (a failing test would be great), I should be able to track down the source. I think I know roughly where the problem is.

@shioyama
Copy link
Contributor

Can you try the branch I just pushed?

Change gem 'globalize' in your Gemfile to:

gem 'globalize', github: 'globalize/globalize', branch: '282_finders_nil'    

@astudnev
Copy link
Author

changing to newer gem gem 'globalize', github: 'globalize/globalize', branch: '282_finders_nil'

solves both issues

as for dynamic finders - i understand that they deprecated names like find_by_name, but not find_by name:

Anyway, it works now for both cases...

@shioyama
Copy link
Contributor

great! I'll merge the change into master a bit later on.

Also, find_by should work, there is test for it here: https://github.com/globalize/globalize/blob/master/test/globalize/translated_attributes_query_test.rb#L54

@shioyama
Copy link
Contributor

merged into master, so I'm closing this.

@parndt
Copy link
Member

parndt commented Oct 22, 2013

This fixed the issue for me too, hooray!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants