Class: ActionDispatch::Routing::Mapper

Inherits:
Object
  • Object
show all
Includes:
ActivityNotification::PolymorphicHelpers
Defined in:
lib/activity_notification/rails/routes.rb

Overview

Extended ActionDispatch::Routing::Mapper implementation to add routing method of ActivityNotification.

Instance Method Summary collapse

Instance Method Details

#notify_to(*resources, *options) ⇒ ActionDispatch::Routing::Mapper

Includes notify_to method for routes, which is responsible to generate all necessary routes for notifications of activity_notification.

When you have an User model configured as a target (e.g. defined acts_as_target), you can create as follows in your routes:

notify_to :users

This method creates the needed routes:

# Notification routes
  user_notifications          GET    /users/:user_id/notifications(.:format)
    { controller:"activity_notification/notifications", action:"index", target_type:"users" }
  user_notification           GET    /users/:user_id/notifications/:id(.:format)
    { controller:"activity_notification/notifications", action:"show", target_type:"users" }
  user_notification           DELETE /users/:user_id/notifications/:id(.:format)
    { controller:"activity_notification/notifications", action:"destroy", target_type:"users" }
  open_all_user_notifications POST   /users/:user_id/notifications/open_all(.:format)
    { controller:"activity_notification/notifications", action:"open_all", target_type:"users" }
  move_user_notification      GET    /users/:user_id/notifications/:id/move(.:format)
    { controller:"activity_notification/notifications", action:"move", target_type:"users" }
  open_user_notification      POST   /users/:user_id/notifications/:id/open(.:format)
    { controller:"activity_notification/notifications", action:"open", target_type:"users" }

When you use devise authentication and you want make notification targets assciated with devise, you can create as follows in your routes:

notify_to :users, with_devise: :users

This with_devise option creates the needed routes assciated with devise authentication:

# Notification with devise routes
  user_notifications          GET    /users/:user_id/notifications(.:format)
    { controller:"activity_notification/notifications_with_devise", action:"index", target_type:"users", devise_type:"users" }
  user_notification           GET    /users/:user_id/notifications/:id(.:format)
    { controller:"activity_notification/notifications_with_devise", action:"show", target_type:"users", devise_type:"users" }
  user_notification           DELETE /users/:user_id/notifications/:id(.:format)
    { controller:"activity_notification/notifications_with_devise", action:"destroy", target_type:"users", devise_type:"users" }
  open_all_user_notifications POST   /users/:user_id/notifications/open_all(.:format)
    { controller:"activity_notification/notifications_with_devise", action:"open_all", target_type:"users", devise_type:"users" }
  move_user_notification      GET    /users/:user_id/notifications/:id/move(.:format)
    { controller:"activity_notification/notifications_with_devise", action:"move", target_type:"users", devise_type:"users" }
  open_user_notification      POST   /users/:user_id/notifications/:id/open(.:format)
    { controller:"activity_notification/notifications_with_devise", action:"open", target_type:"users", devise_type:"users" }

When you would like to define subscription management paths with notification paths, you can create as follows in your routes:

notify_to :users, with_subscription: true

or you can also set options for subscription path:

notify_to :users, with_subscription: { except: [:index] }

If you configure this :with_subscription option with :with_devise option, with_subscription paths are also automatically configured with devise authentication as the same as notifications

notify_to :users, with_devise: :users, with_subscription: true

Examples:

Define notify_to in config/routes.rb

notify_to :users

Define notify_to with options

notify_to :users, only: [:open, :open_all, :move]

Integrated with Devise authentication

notify_to :users, with_devise: :users

Define notification paths including subscription paths

notify_to :users, with_subscription: true

Parameters:

  • resources (Symbol)

    Resources to notify

Options Hash (*options):

  • :with_devise (Symbol) — default: false

    Devise resources name for devise integration. Devise integration will be enabled by this option.

  • :with_subscription (Hash|Boolean) — default: false

    Subscription path options to define subscription management paths with notification paths. Calls subscribed_by routing when truthy value is passed as this option.

  • :model (String) — default: :notifications

    Model name of notifications

  • :controller (String) — default: "activity_notification/notifications" | activity_notification/notifications_with_devise"

    :controller option as resources routing

  • :as (Symbol) — default: nil

    :as option as resources routing

  • :only (Array) — default: nil

    :only option as resources routing

  • :except (Array) — default: nil

    :except option as resources routing

Returns:



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/activity_notification/rails/routes.rb', line 74

def notify_to(*resources)
  options = create_options(:notifications, resources.extract_options!, [:new, :create, :edit, :update])

  resources.each do |target|
    self.resources target, only: :none do
      options[:defaults] = { target_type: target.to_s }.merge(options[:devise_defaults])
      resources_options = options.select { |key, _| [:with_devise, :with_subscription, :subscription_option, :model, :devise_defaults].exclude? key }
      self.resources options[:model], resources_options do
        collection do
          post :open_all unless ignore_path?(:open_all, options)
        end
        member do
          get  :move     unless ignore_path?(:move, options)
          post :open     unless ignore_path?(:open, options)
        end
      end
    end

    if options[:with_subscription].present? && target.to_s.to_model_class.subscription_enabled?
      subscribed_by target, options[:subscription_option]
    end
  end

  self
end

#subscribed_by(*resources, *options) ⇒ ActionDispatch::Routing::Mapper

Includes subscribed_by method for routes, which is responsible to generate all necessary routes for subscriptions of activity_notification.

When you have an User model configured as a target (e.g. defined acts_as_target), you can create as follows in your routes:

subscribed_by :users

This method creates the needed routes:

# Subscription routes
  user_subscriptions                                GET    /users/:user_id/subscriptions(.:format)
    { controller:"activity_notification/subscriptions", action:"index", target_type:"users" }
  user_subscription                                 GET    /users/:user_id/subscriptions/:id(.:format)
    { controller:"activity_notification/subscriptions", action:"show", target_type:"users" }
  open_all_user_subscriptions                       POST   /users/:user_id/subscriptions(.:format)
    { controller:"activity_notification/subscriptions", action:"create", target_type:"users" }
  user_subscription                                 DELETE /users/:user_id/subscriptions/:id(.:format)
    { controller:"activity_notification/subscriptions", action:"destroy", target_type:"users" }
  subscribe_user_subscription                       POST   /users/:user_id/subscriptions/:id/subscribe(.:format)
    { controller:"activity_notification/subscriptions", action:"subscribe", target_type:"users" }
  unsubscribe_user_subscription                     POST   /users/:user_id/subscriptions/:id/unsubscribe(.:format)
    { controller:"activity_notification/subscriptions", action:"unsubscribe", target_type:"users" }
  subscribe_to_email_user_subscription              POST   /users/:user_id/subscriptions/:id/subscribe_to_email(.:format)
    { controller:"activity_notification/subscriptions", action:"subscribe_to_email", target_type:"users" }
  unsubscribe_to_email_user_subscription            POST   /users/:user_id/subscriptions/:id/unsubscribe_to_email(.:format)
    { controller:"activity_notification/subscriptions", action:"unsubscribe_to_email", target_type:"users" }
  subscribe_to_optional_target_user_subscription    POST   /users/:user_id/subscriptions/:id/subscribe_to_optional_target(.:format)
    { controller:"activity_notification/subscriptions", action:"subscribe_to_optional_target", target_type:"users" }
  unsubscribe_to_optional_target_user_subscription  POST   /users/:user_id/subscriptions/:id/unsubscribe_to_optional_target(.:format)
    { controller:"activity_notification/subscriptions", action:"unsubscribe_to_optional_target", target_type:"users" }

When you use devise authentication and you want make subscription targets assciated with devise, you can create as follows in your routes:

notify_to :users, with_devise: :users

This with_devise option creates the needed routes assciated with devise authentication:

# Subscription with devise routes
  user_subscriptions                                GET    /users/:user_id/subscriptions(.:format)
    { controller:"activity_notification/subscriptions_with_devise", action:"index", target_type:"users", devise_type:"users" }
  user_subscription                                 GET    /users/:user_id/subscriptions/:id(.:format)
    { controller:"activity_notification/subscriptions_with_devise", action:"show", target_type:"users", devise_type:"users" }
  open_all_user_subscriptions                       POST   /users/:user_id/subscriptions(.:format)
    { controller:"activity_notification/subscriptions_with_devise", action:"create", target_type:"users", devise_type:"users" }
  user_subscription                                 DELETE /users/:user_id/subscriptions/:id(.:format)
    { controller:"activity_notification/subscriptions_with_devise", action:"destroy", target_type:"users", devise_type:"users" }
  subscribe_user_subscription                       POST   /users/:user_id/subscriptions/:id/subscribe(.:format)
    { controller:"activity_notification/subscriptions_with_devise", action:"subscribe", target_type:"users", devise_type:"users" }
  unsubscribe_user_subscription                     POST   /users/:user_id/subscriptions/:id/unsubscribe(.:format)
    { controller:"activity_notification/subscriptions_with_devise", action:"unsubscribe", target_type:"users", devise_type:"users" }
  subscribe_to_email_user_subscription              POST   /users/:user_id/subscriptions/:id/subscribe_to_email(.:format)
    { controller:"activity_notification/subscriptions_with_devise", action:"subscribe_to_email", target_type:"users", devise_type:"users" }
  unsubscribe_to_email_user_subscription            POST   /users/:user_id/subscriptions/:id/unsubscribe_to_email(.:format)
    { controller:"activity_notification/subscriptions_with_devise", action:"unsubscribe_to_email", target_type:"users", devise_type:"users" }
  subscribe_to_optional_target_user_subscription    POST   /users/:user_id/subscriptions/:id/subscribe_to_optional_target(.:format)
    { controller:"activity_notification/subscriptions_with_devise", action:"subscribe_to_optional_target", target_type:"users", devise_type:"users" }
  unsubscribe_to_optional_target_user_subscription  POST   /users/:user_id/subscriptions/:id/unsubscribe_to_optional_target(.:format)
    { controller:"activity_notification/subscriptions_with_devise", action:"unsubscribe_to_optional_target", target_type:"users", devise_type:"users" }

Examples:

Define subscribed_by in config/routes.rb

subscribed_by :users

Define subscribed_by with options

subscribed_by :users, except: [:index, :show]

Integrated with Devise authentication

subscribed_by :users, with_devise: :users

Parameters:

  • resources (Symbol)

    Resources to notify

Options Hash (*options):

  • :with_devise (Symbol) — default: false

    Devise resources name for devise integration. Devise integration will be enabled by this option.

  • :model (String) — default: :subscriptions

    Model name of subscriptions

  • :controller (String) — default: "activity_notification/subscriptions" | activity_notification/subscriptions_with_devise"

    :controller option as resources routing

  • :as (Symbol) — default: nil

    :as option as resources routing

  • :only (Array) — default: nil

    :only option as resources routing

  • :except (Array) — default: nil

    :except option as resources routing

Returns:



170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/activity_notification/rails/routes.rb', line 170

def subscribed_by(*resources)
  options = create_options(:subscriptions, resources.extract_options!, [:new, :edit, :update])

  resources.each do |target|
    self.resources target, only: :none do
      options[:defaults] = { target_type: target.to_s }.merge(options[:devise_defaults])
      resources_options = options.select { |key, _| [:with_devise, :model, :devise_defaults].exclude? key }
      self.resources options[:model], resources_options do
        member do
          post :subscribe                      unless ignore_path?(:subscribe, options)
          post :unsubscribe                    unless ignore_path?(:unsubscribe, options)
          post :subscribe_to_email             unless ignore_path?(:subscribe_to_email, options)
          post :unsubscribe_to_email           unless ignore_path?(:unsubscribe_to_email, options)
          post :subscribe_to_optional_target   unless ignore_path?(:subscribe_to_optional_target, options)
          post :unsubscribe_to_optional_target unless ignore_path?(:unsubscribe_to_optional_target, options)
        end
      end
    end
  end

  self
end