diff options
Diffstat (limited to 'actioncable/lib/rails/generators')
4 files changed, 71 insertions, 0 deletions
diff --git a/actioncable/lib/rails/generators/channel/USAGE b/actioncable/lib/rails/generators/channel/USAGE new file mode 100644 index 0000000000..27a934c689 --- /dev/null +++ b/actioncable/lib/rails/generators/channel/USAGE @@ -0,0 +1,14 @@ +Description: +============ +    Stubs out a new cable channel for the server (in Ruby) and client (in CoffeeScript). +    Pass the channel name, either CamelCased or under_scored, and an optional list of channel actions as arguments. + +    Note: Turn on the cable connection in app/assets/javascript/cable.coffee after generating any channels. + +Example: +======== +    rails generate channel Chat speak + +    creates a Chat channel class and CoffeeScript asset: +        Channel:    app/channels/chat_channel.rb +        Assets:     app/assets/javascript/channels/chat.coffee diff --git a/actioncable/lib/rails/generators/channel/channel_generator.rb b/actioncable/lib/rails/generators/channel/channel_generator.rb new file mode 100644 index 0000000000..c5d398810a --- /dev/null +++ b/actioncable/lib/rails/generators/channel/channel_generator.rb @@ -0,0 +1,26 @@ +module Rails +  module Generators +    class ChannelGenerator < NamedBase +      source_root File.expand_path("../templates", __FILE__) + +      argument :actions, type: :array, default: [], banner: "method method" + +      class_option :assets, type: :boolean + +      check_class_collision suffix: "Channel" + +      def create_channel_file +        template "channel.rb", File.join('app/channels', class_path, "#{file_name}_channel.rb") + +        if options[:assets] +          template "assets/channel.coffee", File.join('app/assets/javascripts/channels', class_path, "#{file_name}.coffee") +        end +      end + +      protected +        def file_name +          @_file_name ||= super.gsub(/\_channel/i, '') +        end +    end +  end +end diff --git a/actioncable/lib/rails/generators/channel/templates/assets/channel.coffee b/actioncable/lib/rails/generators/channel/templates/assets/channel.coffee new file mode 100644 index 0000000000..5467811aba --- /dev/null +++ b/actioncable/lib/rails/generators/channel/templates/assets/channel.coffee @@ -0,0 +1,14 @@ +App.<%= class_name.underscore %> = App.cable.subscriptions.create "<%= class_name %>Channel", +  connected: -> +    # Called when the subscription is ready for use on the server + +  disconnected: -> +    # Called when the subscription has been terminated by the server + +  received: (data) -> +    # Called when there's incoming data on the websocket for this channel +<% actions.each do |action| -%> + +  <%= action %>: -> +    @perform '<%= action %>' +<% end -%> diff --git a/actioncable/lib/rails/generators/channel/templates/channel.rb b/actioncable/lib/rails/generators/channel/templates/channel.rb new file mode 100644 index 0000000000..6cf04ee61f --- /dev/null +++ b/actioncable/lib/rails/generators/channel/templates/channel.rb @@ -0,0 +1,17 @@ +# Be sure to restart your server when you modify this file. Action Cable runs in an EventMachine loop that does not support auto reloading. +<% module_namespacing do -%> +class <%= class_name %>Channel < ApplicationCable::Channel +  def subscribed +    # stream_from "some_channel" +  end + +  def unsubscribed +    # Any cleanup needed when channel is unsubscribed +  end +<% actions.each do |action| -%> + +  def <%= action %> +  end +<% end -%> +end +<% end -%>  | 
