user3100151 user3100151 - 1 year ago 52
Ruby Question

undefined method `normalize' in service object MetaInspector

I am trying to use the url entered by a user to gather the title, description, root_url, scheme and host for that URL.

Right now, I am getting this error as soon as I call MetaInspector:

NoMethodError - undefined method `normalize' for nil:NilClass:

Help will be extremely appreciated here. I have tried many things without any conclusive results. What am I missing?

Here's my code:

I hit the links#new view..


NoMethodError - undefined method `normalize' for nil:NilClass:

metainspector (5.2.1) lib/meta_inspector/url.rb:83:in `normalized'
metainspector (5.2.1) lib/meta_inspector/url.rb:50:in `url='
metainspector (5.2.1) lib/meta_inspector/url.rb:12:in `initialize'
metainspector (5.2.1) lib/meta_inspector/document.rb:31:in `initialize'
metainspector (5.2.1) lib/meta_inspector.rb:20:in `new'
app/services/get_meta.rb:11:in `new_record'
app/controllers/links_controller.rb:8:in `create'
actionpack (4.2.6) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
actionpack (4.2.6) lib/abstract_controller/base.rb:198:in `process_action'
actionpack (4.2.6) lib/action_controller/metal/rendering.rb:10:in `process_action'
actionpack (4.2.6) lib/abstract_controller/callbacks.rb:20:in `block in process_action'
activesupport (4.2.6) lib/active_support/callbacks.rb:117:in `call'
activesupport (4.2.6) lib/active_support/callbacks.rb:555:in `block (2 levels) in compile'
activesupport (4.2.6) lib/active_support/callbacks.rb:505:in `call'
activesupport (4.2.6) lib/active_support/callbacks.rb:92:in `__run_callbacks__'
activesupport (4.2.6) lib/active_support/callbacks.rb:778:in `_run_process_action_callbacks'
activesupport (4.2.6) lib/active_support/callbacks.rb:81:in `run_callbacks'
actionpack (4.2.6) lib/abstract_controller/callbacks.rb:19:in `process_action'
actionpack (4.2.6) lib/action_controller/metal/rescue.rb:29:in `process_action'
actionpack (4.2.6) lib/action_controller/metal/instrumentation.rb:32:in `block in process_action'
activesupport (4.2.6) lib/active_support/notifications.rb:164:in `block in instrument'
activesupport (4.2.6) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.2.6) lib/active_support/notifications.rb:164:in `instrument'
actionpack (4.2.6) lib/action_controller/metal/instrumentation.rb:30:in `process_action'
actionpack (4.2.6) lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
activerecord (4.2.6) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
actionpack (4.2.6) lib/abstract_controller/base.rb:137:in `process'
actionview (4.2.6) lib/action_view/rendering.rb:30:in `process'
actionpack (4.2.6) lib/action_controller/metal.rb:196:in `dispatch'
actionpack (4.2.6) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
actionpack (4.2.6) lib/action_controller/metal.rb:237:in `block in action'
actionpack (4.2.6) lib/action_dispatch/routing/route_set.rb:74:in `dispatch'
actionpack (4.2.6) lib/action_dispatch/routing/route_set.rb:43:in `serve'
actionpack (4.2.6) lib/action_dispatch/journey/router.rb:43:in `block in serve'
actionpack (4.2.6) lib/action_dispatch/journey/router.rb:30:in `serve'
actionpack (4.2.6) lib/action_dispatch/routing/route_set.rb:817:in `call'
omniauth (1.3.1) lib/omniauth/strategy.rb:186:in `call!'
omniauth (1.3.1) lib/omniauth/strategy.rb:164:in `call'
omniauth (1.3.1) lib/omniauth/builder.rb:63:in `call'
rack (1.6.4) lib/rack/etag.rb:24:in `call'
rack (1.6.4) lib/rack/conditionalget.rb:38:in `call'
rack (1.6.4) lib/rack/head.rb:13:in `call'
actionpack (4.2.6) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
actionpack (4.2.6) lib/action_dispatch/middleware/flash.rb:260:in `call'
rack (1.6.4) lib/rack/session/abstract/id.rb:225:in `context'
rack (1.6.4) lib/rack/session/abstract/id.rb:220:in `call'
actionpack (4.2.6) lib/action_dispatch/middleware/cookies.rb:560:in `call'
activerecord (4.2.6) lib/active_record/query_cache.rb:36:in `call'
activerecord (4.2.6) lib/active_record/connection_adapters/abstract/connection_pool.rb:653:in `call'
activerecord (4.2.6) lib/active_record/migration.rb:377:in `call'
actionpack (4.2.6) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
activesupport (4.2.6) lib/active_support/callbacks.rb:88:in `__run_callbacks__'
activesupport (4.2.6) lib/active_support/callbacks.rb:778:in `_run_call_callbacks'
activesupport (4.2.6) lib/active_support/callbacks.rb:81:in `run_callbacks'
actionpack (4.2.6) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
actionpack (4.2.6) lib/action_dispatch/middleware/reloader.rb:73:in `call'
actionpack (4.2.6) lib/action_dispatch/middleware/remote_ip.rb:78:in `call'
better_errors (2.1.1) lib/better_errors/middleware.rb:84:in `protected_app_call'
better_errors (2.1.1) lib/better_errors/middleware.rb:79:in `better_errors_call'
better_errors (2.1.1) lib/better_errors/middleware.rb:57:in `call'
actionpack (4.2.6) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
actionpack (4.2.6) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
railties (4.2.6) lib/rails/rack/logger.rb:38:in `call_app'
railties (4.2.6) lib/rails/rack/logger.rb:20:in `block in call'
activesupport (4.2.6) lib/active_support/tagged_logging.rb:68:in `block in tagged'
activesupport (4.2.6) lib/active_support/tagged_logging.rb:26:in `tagged'
activesupport (4.2.6) lib/active_support/tagged_logging.rb:68:in `tagged'
railties (4.2.6) lib/rails/rack/logger.rb:20:in `call'
actionpack (4.2.6) lib/action_dispatch/middleware/request_id.rb:21:in `call'
rack (1.6.4) lib/rack/methodoverride.rb:22:in `call'
rack (1.6.4) lib/rack/runtime.rb:18:in `call'
activesupport (4.2.6) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
rack (1.6.4) lib/rack/lock.rb:17:in `call'
actionpack (4.2.6) lib/action_dispatch/middleware/static.rb:120:in `call'
rack (1.6.4) lib/rack/sendfile.rb:113:in `call'
railties (4.2.6) lib/rails/engine.rb:518:in `call'
railties (4.2.6) lib/rails/application.rb:165:in `call'
rack (1.6.4) lib/rack/content_length.rb:15:in `call'
puma (3.4.0) lib/puma/configuration.rb:224:in `call'
puma (3.4.0) lib/puma/server.rb:569:in `handle_request'
puma (3.4.0) lib/puma/server.rb:406:in `process_client'
puma (3.4.0) lib/puma/server.rb:271:in `block in run'
puma (3.4.0) lib/puma/thread_pool.rb:114:in `block in spawn_thread'

I have two models:


class Domain < ActiveRecord::Base

has_many :links


class Link < ActiveRecord::Base

has_one :domain



# Table name: links
# id :integer not null, primary key
# url :string
# created_at :datetime not null
# updated_at :datetime not null

# Table name: domains
# id :integer not null, primary key
# root_url :string
# scheme :string
# host :string
# created_at :datetime not null
# updated_at :datetime not null

Links Controller

class LinksController < ApplicationController

def new
@link =

def create
@link =[:url]).new_record

redirect_to root_url



def link_params
params.require(:link).permit(:url, :created_at, :updated_at)

Service Object: Get_Meta.rb

class GetMeta
include ActiveModel::Model

def initialize(url)
@url = url

def new_record

page =

Link.create! do |link|
link.url = page.url
link.title = page.title
link.description = page.description page.root, scheme: page.scheme, host:


Answer Source

Ok, so the relevant lines from the stacktrace are these two:

NoMethodError - undefined method `normalize' for nil:NilClass:
metainspector (5.2.1) lib/meta_inspector/url.rb:83:in `normalized'

From the message, you can already guess that something is nil that metainspector was assuming wouldn't be. But lets follow the stacktrace just to be sure.

A you list in your comment (thanks for that BTW it's really a good idea!) the project is here:

If you click that then look for the file listed: lib/meta_inspector/url.rb:83 and look at line 83 as specified above, you get this:

# Normalize url to deal with characters that should be encoded,
# add trailing slash, convert to downcase...
def normalized(url)

so... normalized in metainspector is expecting there to actually be a url... and is freaking out when it's nil. So that confirms that the problem is that there is no url being passed into metainspector.

This means you need to check for that before passing in the url... or at least figure out why you're not passing throught he url... whic I think I can see why here:

This line indicated that the params are likely to come through as: {:link => {:url => 'some_url'}}

  params.require(:link).permit(:url, :created_at, :updated_at)

which you'd access with params[:link][:url]

but your code that uses the url is:

 @link =[:url]).new_record

so I'd change the usage above to the below and you should be good to go

 @link =[:link][:url]).new_record