Question

I'm trying to implement a signup form. See this screenshot. I'm using the LearnRails tutorial to help me.

It works when you type in a valid email address. However, if you don't type in a valid email address, it's giving me this error: undefined method 'empty?' for nil:NilClass. My logs say this:

ActionView::Template::Error (undefined method `name' for nil:NilClass):
    1: <% content_for(:title, "#{@college.name} Student Reviews" + " | #{params[:section1]} | #{params[:section2]}".titleize) %>
    2: <% description "#{@question}" %>
    3: 
    4: <div id="college_pages_css">
  app/views/college_pages/disqus_normal.html.erb:1:in `_app_views_college_pages_disqus_normal_html_erb___3963356040782610986_70269489097160'

Which is weird because it should be redirecting to my home page, which doesn't have the @college variable.

Note: I'm using the activerecord-tableless gem, because the tutorial uses it.

Model

class Subscriber < ActiveRecord::Base
    attr_accessible :email
    has_no_table
    column :email, :string
    validates_presence_of :email
    validates_format_of :email,
        :with => /\A[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}\z/i

    def subscribe
        mailchimp = Gibbon::API.new(ENV['MAILCHIMP_API_KEY'])
        result = mailchimp.lists.subscribe({
            :id => ENV['MAILCHIMP_LIST_ID'],
            :email => {:email => self.email},
            :double_optin => false,
            :update_existing => true,
            :send_welcome => true
        })
        Rails.logger.info("Subscribed #{self.email} to MailChimp") if result
    end
end

Controller

class SubscriberController < ApplicationController

  def create
    @subscriber = Subscriber.new(params[:subscribe])
    if @subscriber.valid?
        @subscriber.subscribe
        redirect_to root_path
    else
        render root_path
    end
  end
end

View

<%= simple_form_for :subscribe, url: 'subscribe' do |f| %>
    <%= f.input :email, label: false %> <br/>
    <%= f.button :submit, "Notify me", class: "btn btn-primary" %>
<% end %>

Note that the tutorial uses a secure_params method while I'm using attr_accessible. I wouldn't think that this would be a problem, but it's possible.

I was thinking of ignoring this issue, and just using client side validations, but that causes my site to crash. On the topic of client side validations, aren't HTML5 email input fields supposed to automatically validate?

How can I fix this issue?

Edit: Logs when I load the home page

Started GET "/" for 127.0.0.1 at 2014-04-01 16:15:47 -0400
Processing by StaticPagesController#home as HTML
  Rendered static_pages/home.html.erb within layouts/application (3.6ms)
Completed 200 OK in 41ms (Views: 40.3ms | ActiveRecord: 0.0ms)


Started GET "/assets/jquery.ui.theme.css?body=1" for 127.0.0.1 at 2014-04-01 16:15:47 -0400


Started GET "/assets/jquery.ui.accordion.css?body=1" for 127.0.0.1 at 2014-04-01 16:15:47 -0400
.
.
.
Started GET "/favicon.ico" for 127.0.0.1 at 2014-04-01 16:15:49 -0400


Started GET "/favicon/academics/professors/1" for 127.0.0.1 at 2014-04-01 16:15:50 -0400
Processing by CollegePagesController#disqus_normal as */*
  Parameters: {"college"=>"favicon", "section1"=>"academics", "section2"=>"professors", "question_id"=>"1"}
  College Load (1.4ms)  SELECT "colleges".* FROM "colleges" WHERE "colleges"."url" = 'favicon' LIMIT 1
  Rendered college_pages/disqus_normal.html.erb within layouts/application (3.7ms)
Completed 500 Internal Server Error in 14ms

ActionView::Template::Error (undefined method `name' for nil:NilClass):
    1: <% content_for(:title, "#{@college.name} Student Reviews" + " | #{params[:section1]} | #{params[:section2]}".titleize) %>
    2: <% description "#{@question}" %>
    3: 
    4: <div id="college_pages_css">
  app/views/college_pages/disqus_normal.html.erb:1:in `_app_views_college_pages_disqus_normal_html_erb___3963356040782610986_70269489097160'


  Rendered /Users/adamzerner/.rvm/gems/ruby-2.0.0-p451@global/gems/actionpack-4.0.3/lib/action_dispatch/middleware/templates/rescues/_trace.erb (80.6ms)
  Rendered /Users/adamzerner/.rvm/gems/ruby-2.0.0-p451@global/gems/actionpack-4.0.3/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.6ms)
  Rendered /Users/adamzerner/.rvm/gems/ruby-2.0.0-p451@global/gems/actionpack-4.0.3/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (98.3ms)


Started GET "/assets/favicon.ico" for 127.0.0.1 at 2014-04-01 16:15:50 -0400

disqus_normal action

def disqus_normal
  @college = College.find_by_url(params[:college])
  @question = get_question(params[:section2], params[:question_id])
end
Was it helpful?

Solution

The error

undefined method 'name' for nil:NilClass

is appearing on line 1 which is

<% content_for(:title, "#{@college.name} Student Reviews" + " | #{params[:section1]} | #{params[:section2]}".titleize) %>

of college_pages/disqus_normal.html.erb page.

It means that @college is nil and you are trying to access property name on a nil object. Hence, the error.

To resolve this make sure that you set the value of @college instance variable in the action from where you are redirecting to this page.

UPDATE

Also, there was an issue with routing.

get '/:college', to: redirect('/%{college}/academics/professors/1')

Because of the above problematic route GET "/favicon.ico" is getting converted to GET "/favicon/academics/professors/1" and disqus_normal is getting called. Ideally it would be better if you add some static text to the problematic route.

For example:

get '/college/:college', to: redirect('/%{college}/academics/professors/1')

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top