Title: Polymorphic relations problem: undefined method for nil:NilClass · Issue #1305 · JSONAPI-Resources/jsonapi-resources · GitHub
Open Graph Title: Polymorphic relations problem: undefined method for nil:NilClass · Issue #1305 · JSONAPI-Resources/jsonapi-resources
X Title: Polymorphic relations problem: undefined method for nil:NilClass · Issue #1305 · JSONAPI-Resources/jsonapi-resources
Description: This issue is a (choose one): Problem/bug report. Feature request. Request for support. Note: Please try to avoid submitting issues for support requests. Use Gitter instead. Checklist before submitting: I've searched for an existing issu...
Open Graph Description: This issue is a (choose one): Problem/bug report. Feature request. Request for support. Note: Please try to avoid submitting issues for support requests. Use Gitter instead. Checklist before submit...
X Description: This issue is a (choose one): Problem/bug report. Feature request. Request for support. Note: Please try to avoid submitting issues for support requests. Use Gitter instead. Checklist before submit...
Opengraph URL: https://github.com/JSONAPI-Resources/jsonapi-resources/issues/1305
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Polymorphic relations problem: undefined method for nil:NilClass","articleBody":"## This issue is a (choose one):\r\n\r\n- [x] Problem/bug report.\r\n- [ ] Feature request.\r\n- [ ] Request for support. **Note: Please try to avoid submitting issues for support requests. Use [Gitter](https://gitter.im/cerebris/jsonapi-resources) instead.** \r\n\r\n## Checklist before submitting:\r\n\r\n- [x] I've searched for an existing issue.\r\n- [x] I've asked my question on [Gitter](https://gitter.im/cerebris/jsonapi-resources) and have not received a satisfactory answer.\r\n- [x] I've included a complete [bug report template](https://github.com/cerebris/jsonapi-resources/blob/master/lib/bug_report_templates/rails_5_master.rb). This step helps us and allows us to see the bug without trying to reproduce the problem from your description. It helps you because you will frequently detect if it's a problem specific to your project.\r\n- [x] The feature I'm asking for is compliant with the [JSON:API](http://jsonapi.org/) spec.\r\n\r\n## Description\r\n\r\nI seem to have bumped into a problem with polymorphic relations I'm unable to solve. Here's a description and a standalone bug report describing it. I'm on JR 0.10.2, Rails 6.0.2.1 and Ruby 2.6.5.\r\n\r\nThe model in question is composed of three ActiveRecord models: ContactMedium, Individuals and Organizations and the corresponding JR resources. The latter may have many contact media as party and one contact medium can belong to either kind of party. \r\n\r\nThe problem comes up when trying to get the individual or organisation as party via the contact media like this: GET /contact-media/1/party\r\n\r\nThe logic works on ActiveRecord level but not in the JR level.\r\n\r\nUsing the relationship results in the following error in the included example case:\r\n```\r\nInternal Server Error: undefined method `downcase' for nil:NilClass\r\n.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/bundler/gems/jsonapi-resources-978f590f85fe/lib/jsonapi/relationship.rb:66:in \r\n`block (3 levels) in polymorphic_types'\r\n```\r\n\r\nThe error is similar in the actual app but with a mild difference (that also included in the included pastebin link):\r\n```\r\nInternal Server Error: undefined method `left' for nil:NilClass\r\n.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/jsonapi-resources-0.10.2/lib/jsonapi/active_relation/join_manager.rb:93:in \r\n`alias_from_arel_node'`\r\n```\r\n\r\nI'm suspecting this behaviour to be a bug. If I'm doing something wrong instead, please let me know. Workaround suggestions also welcome!\r\n\r\n### Bug reports:\r\n\r\n#### Partial report in pastebin\r\n\r\n[https://pastebin.com/V0CfEs3F](https://pastebin.com/V0CfEs3F)\r\n\r\n#### Standalone bug report using the template\r\n\r\n```ruby\r\nbegin\r\n require 'bundler/inline'\r\n require 'bundler'\r\nrescue LoadError =\u003e e\r\n STDERR.puts 'Bundler version 1.10 or later is required. Please update your Bundler'\r\n raise e\r\nend\r\n\r\ngemfile(true, ui: ENV['SILENT'] ? Bundler::UI::Silent.new : Bundler::UI::Shell.new) do\r\n source 'https://rubygems.org'\r\n\r\n gem 'rails', require: false\r\n gem 'sqlite3'\r\n gem 'i18n', '= 1.7.0'\r\n\r\n if ENV['JSONAPI_RESOURCES_PATH']\r\n gem 'jsonapi-resources', path: ENV['JSONAPI_RESOURCES_PATH'], require: false\r\n else\r\n gem 'jsonapi-resources', git: 'https://github.com/cerebris/jsonapi-resources', require: false\r\n end\r\n\r\nend\r\n\r\n# prepare active_record database\r\nrequire 'active_record'\r\n\r\nclass NullLogger \u003c Logger\r\n def initialize(*_args)\r\n end\r\n\r\n def add(*_args, \u0026_block)\r\n end\r\nend\r\n\r\nActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')\r\nActiveRecord::Base.logger = ENV['SILENT'] ? NullLogger.new : Logger.new(STDOUT)\r\nActiveRecord::Migration.verbose = !ENV['SILENT']\r\n\r\nActiveRecord::Schema.define do\r\n # Add your schema here\r\n create_table :contact_media do |t|\r\n t.string :name\r\n t.references :party, polymorphic: true, index: true\r\n end\r\n\r\n create_table :individuals do |t|\r\n t.string :name\r\n end\r\n\r\n create_table :organizations do |t|\r\n t.string :name\r\n end\r\nend\r\n\r\n# create models\r\n class ApplicationRecord \u003c ActiveRecord::Base\r\n self.abstract_class = true\r\nend\r\n\r\nclass ContactMedium \u003c ApplicationRecord\r\n belongs_to :party, polymorphic: true, inverse_of: :contact_media\r\nend\r\n\r\nclass Individual \u003c ApplicationRecord\r\n has_many :contact_media, as: :party\r\nend\r\n\r\nclass Organization \u003c ApplicationRecord\r\n has_many :contact_media, as: :party\r\nend\r\n\r\n# prepare rails app\r\nrequire 'action_controller/railtie'\r\n# require 'action_view/railtie'\r\nrequire 'jsonapi-resources'\r\n\r\nclass ApplicationController \u003c ActionController::Base\r\n protect_from_forgery with: :null_session\r\nend\r\n\r\n# prepare jsonapi resources and controllers\r\n#\r\n\r\nclass IndividualsController \u003c ApplicationController\r\n include JSONAPI::ActsAsResourceController\r\nend\r\n\r\nclass OrganizationsController \u003c ApplicationController\r\n include JSONAPI::ActsAsResourceController\r\nend\r\n\r\nclass ContactMediaController \u003c ApplicationController\r\n include JSONAPI::ActsAsResourceController\r\nend\r\n\r\nclass PartiesController \u003c ApplicationController\r\n include JSONAPI::ActsAsResourceController\r\nend\r\n\r\nclass ContactMediumResource \u003c JSONAPI::Resource\r\n attribute :name\r\n has_one :party, polymorphic: true\r\nend\r\n\r\nclass IndividualResource \u003c JSONAPI::Resource\r\n attribute :name\r\n has_many :contact_media\r\nend\r\n\r\nclass OrganizationResource \u003c JSONAPI::Resource\r\n attribute :name\r\n has_many :contact_media\r\nend\r\n\r\nclass PartyResource \u003c JSONAPI::Resource\r\nend\r\n\r\nclass TestApp \u003c Rails::Application\r\n config.root = File.dirname(__FILE__)\r\n config.logger = ENV['SILENT'] ? NullLogger.new : Logger.new(STDOUT)\r\n Rails.logger = config.logger\r\n\r\n secrets.secret_token = 'secret_token'\r\n secrets.secret_key_base = 'secret_key_base'\r\n\r\n config.eager_load = false\r\n config.hosts \u003c\u003c \"example.org\"\r\nend\r\n\r\n# initialize app\r\nRails.application.initialize!\r\n\r\nJSONAPI.configure do |config|\r\n config.json_key_format = :underscored_key\r\n config.route_format = :underscored_key\r\nend\r\n\r\n# draw routes\r\nRails.application.routes.draw do\r\n jsonapi_resources :contact_media do\r\n jsonapi_relationships\r\n end\r\n jsonapi_resources :individuals do\r\n jsonapi_relationships\r\n end\r\n jsonapi_resources :organizations do\r\n jsonapi_relationships\r\n end\r\nend\r\n\r\n# prepare tests\r\nrequire 'minitest/autorun'\r\nrequire 'rack/test'\r\n\r\n# Replace this with the code necessary to make your test fail.\r\nclass BugTest \u003c Minitest::Test\r\n include Rack::Test::Methods\r\n\r\n def json_api_headers\r\n {'Accept' =\u003e JSONAPI::MEDIA_TYPE, 'CONTENT_TYPE' =\u003e JSONAPI::MEDIA_TYPE}\r\n end\r\n\r\n def teardown\r\n Individual.delete_all\r\n ContactMedium.delete_all\r\n end\r\n\r\n def test_find_party_via_contact_medium\r\n individual = Individual.create(name: 'test')\r\n contact_medium = ContactMedium.create(party: individual, name: 'test contact medium')\r\n fetched_party = contact_medium.party\r\n assert_same individual, fetched_party, \"Expect an individual to have been found via contact medium model's relationship 'party'\"\r\n end\r\n\r\n def test_get_individual\r\n individual = Individual.create(name: 'test')\r\n ContactMedium.create(party: individual, name: 'test contact medium')\r\n get \"/individuals/#{individual.id}\"\r\n assert last_response.ok?\r\n end\r\n\r\n def test_get_party_via_contact_medium\r\n individual = Individual.create(name: 'test')\r\n contact_medium = ContactMedium.create(party: individual, name: 'test contact medium')\r\n get \"/contact_media/#{contact_medium.id}/party\"\r\n assert last_response.ok?, \"Expect an individual to have been found via contact medium resource's relationship 'party'\"\r\n end\r\n\r\n private\r\n\r\n def app\r\n Rails.application\r\n end\r\nend\r\n```","author":{"url":"https://github.com/turtleman","@type":"Person","name":"turtleman"},"datePublished":"2020-01-27T13:40:33.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":9},"url":"https://github.com/1305/jsonapi-resources/issues/1305"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:474e9206-c536-6399-189a-c3c90d596a1b |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | E5D8:1A2FA1:A86D0BD:ABF2A97:6A50BC8F |
| html-safe-nonce | 98b1de82c89d4fc0e742fb315a4e508167cf17362718c9bf7a5b58ea14ceade3 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFNUQ4OjFBMkZBMTpBODZEMEJEOkFCRjJBOTc6NkE1MEJDOEYiLCJ2aXNpdG9yX2lkIjoiMTc3ODY3MDkzNDAxNTY1NTA1NiIsInJlZ2lvbl9lZGdlIjoic2VhIiwicmVnaW9uX3JlbmRlciI6InNlYSJ9 |
| visitor-hmac | cc5272ae6e8bbd5091254bf9cc41bf6e9aaa7edb5addb77ec9edad9911e6db5e |
| hovercard-subject-tag | issue:555581050 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/JSONAPI-Resources/jsonapi-resources/1305/issue_layout |
| twitter:image | https://opengraph.githubassets.com/018ac7132fb1c0a3aab67b4f91b04f4a5528119856cd762e257a6ccdfa9adf6f/JSONAPI-Resources/jsonapi-resources/issues/1305 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/018ac7132fb1c0a3aab67b4f91b04f4a5528119856cd762e257a6ccdfa9adf6f/JSONAPI-Resources/jsonapi-resources/issues/1305 |
| og:image:alt | This issue is a (choose one): Problem/bug report. Feature request. Request for support. Note: Please try to avoid submitting issues for support requests. Use Gitter instead. Checklist before submit... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | turtleman |
| hostname | github.com |
| expected-hostname | github.com |
| None | 72b13e0e8d0319acdd27a145cfe73f4f06c791713d0ac4690e41fb68ad28cac0 |
| turbo-cache-control | no-preview |
| go-import | github.com/JSONAPI-Resources/jsonapi-resources git https://github.com/JSONAPI-Resources/jsonapi-resources.git |
| octolytics-dimension-user_id | 262422067 |
| octolytics-dimension-user_login | JSONAPI-Resources |
| octolytics-dimension-repository_id | 18248068 |
| octolytics-dimension-repository_nwo | JSONAPI-Resources/jsonapi-resources |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 18248068 |
| octolytics-dimension-repository_network_root_nwo | JSONAPI-Resources/jsonapi-resources |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 08e79d53fc070870d5b168356afebb1e286a2ffe |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width