Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

Ruby

Error posting an action to an array

I'm using rails mailboxer to handle my app's notifications. I've been able to send a notification to single users as outlined in their documentation but I can't figure out how to send a notification to an array of users. In my case, their followers.

I get this error when I try to send to an array:

undefined method `notify_all' for #<Array:0x696faf8>

My Model:

class Update < ActiveRecord::Base
    belongs_to :member
    belongs_to :updateable, polymorphic: true
    attr_accessible :title, :content

    after_create :create_notification, on: :create

    def create_notification
    subject = "#{member.user_name}"
    body = "posted a new update <b>#{title}:</b> <p><i>#{content}</i></p>"
    updateable.followers.notify_all(subject, body, self)
    end
end

My Controller:

class UpdatesController < ApplicationController
    before_filter :authenticate_member!
    before_filter :load_updateable
    before_filter :find_member

    def index
        redirect_to root_path
    end

    def new
        @update = @updateable.updates.new
    end

    def create
        @update = @updateable.updates.new(params[:update])
        @update.member = current_member

        respond_to do |format|
        if @update.save
            format.html { redirect_to @updateable }
            format.json { render json: @updateable }
        else
            format.html { redirect_to @updateable }
            format.json { render json: @updateable.errors, status: :unprocessable_entity }
        end
    end 
end

def destroy
    @update = Update.find(params[:id])

    respond_to do |format|
      if @update.member == current_member || @updateable.member == current_member
        @update.destroy
        format.html { redirect_to :back }
      else
        format.html { redirect_to :back, alert: 'You can\'t delete this update.' }
      end
    end 
end

private

# def load_updateable
#       resource, id = request.path.split('/')[1,2] # photos/1/
#       @updateable = resource.singularize.classify.constantize.find(id) #    Photo.find(1)
# end 

# alternative option:
def load_updateable
    klass = [Project, Event].detect { |c| params["#{c.name.underscore}_id"] }
    @updateable = klass.find(params["#{klass.name.underscore}_id"])
end

def find_member
    @member = Member.find_by_user_name(params[:user_name])
end 

end

1 Answer

I figured this one out I just needed to loop through the array and notify each follower

updateable.followers.each { |follower| follower.notify(subject, body, self) }