How do you stream a broadcast to a specific user in Rails 5 with ActionCable?












2















I have 2 user types in my application (worker and company). Both user types are created with Devise. I'm currently trying to send a notification to a specific company with ActionCable.



My main problem is that when I send a notification every single company that's signed in receives it. I get that I'm supposed to include the company id in the stream name in some way, but I haven't had any luck so far.



I've included the working code that sends notifications to all companies below:



notifications_channel.rb



class NotificationsChannel < ApplicationCable::Channel
def subscribed
stream_from "notifications_channel"
end

def unsubscribed
# Any cleanup needed when channel is unsubscribed
end
end


connection.rb



module ApplicationCable
class Connection < ActionCable::Connection::Base
end
end


Call to the broadcast



ActionCable.server.broadcast 'notifications_channel', { 'My data' }


EDIT



I log the status of the notification with javascript:



notifications.js



App.notifications = App.cable.subscriptions.create("NotificationsChannel", {
connected: function() {
console.log("connected");
};

disconnected: function() {
console.log("disconnected");
};

received: function(data) {
console.log("recieved");
};
});









share|improve this question





























    2















    I have 2 user types in my application (worker and company). Both user types are created with Devise. I'm currently trying to send a notification to a specific company with ActionCable.



    My main problem is that when I send a notification every single company that's signed in receives it. I get that I'm supposed to include the company id in the stream name in some way, but I haven't had any luck so far.



    I've included the working code that sends notifications to all companies below:



    notifications_channel.rb



    class NotificationsChannel < ApplicationCable::Channel
    def subscribed
    stream_from "notifications_channel"
    end

    def unsubscribed
    # Any cleanup needed when channel is unsubscribed
    end
    end


    connection.rb



    module ApplicationCable
    class Connection < ActionCable::Connection::Base
    end
    end


    Call to the broadcast



    ActionCable.server.broadcast 'notifications_channel', { 'My data' }


    EDIT



    I log the status of the notification with javascript:



    notifications.js



    App.notifications = App.cable.subscriptions.create("NotificationsChannel", {
    connected: function() {
    console.log("connected");
    };

    disconnected: function() {
    console.log("disconnected");
    };

    received: function(data) {
    console.log("recieved");
    };
    });









    share|improve this question



























      2












      2








      2








      I have 2 user types in my application (worker and company). Both user types are created with Devise. I'm currently trying to send a notification to a specific company with ActionCable.



      My main problem is that when I send a notification every single company that's signed in receives it. I get that I'm supposed to include the company id in the stream name in some way, but I haven't had any luck so far.



      I've included the working code that sends notifications to all companies below:



      notifications_channel.rb



      class NotificationsChannel < ApplicationCable::Channel
      def subscribed
      stream_from "notifications_channel"
      end

      def unsubscribed
      # Any cleanup needed when channel is unsubscribed
      end
      end


      connection.rb



      module ApplicationCable
      class Connection < ActionCable::Connection::Base
      end
      end


      Call to the broadcast



      ActionCable.server.broadcast 'notifications_channel', { 'My data' }


      EDIT



      I log the status of the notification with javascript:



      notifications.js



      App.notifications = App.cable.subscriptions.create("NotificationsChannel", {
      connected: function() {
      console.log("connected");
      };

      disconnected: function() {
      console.log("disconnected");
      };

      received: function(data) {
      console.log("recieved");
      };
      });









      share|improve this question
















      I have 2 user types in my application (worker and company). Both user types are created with Devise. I'm currently trying to send a notification to a specific company with ActionCable.



      My main problem is that when I send a notification every single company that's signed in receives it. I get that I'm supposed to include the company id in the stream name in some way, but I haven't had any luck so far.



      I've included the working code that sends notifications to all companies below:



      notifications_channel.rb



      class NotificationsChannel < ApplicationCable::Channel
      def subscribed
      stream_from "notifications_channel"
      end

      def unsubscribed
      # Any cleanup needed when channel is unsubscribed
      end
      end


      connection.rb



      module ApplicationCable
      class Connection < ActionCable::Connection::Base
      end
      end


      Call to the broadcast



      ActionCable.server.broadcast 'notifications_channel', { 'My data' }


      EDIT



      I log the status of the notification with javascript:



      notifications.js



      App.notifications = App.cable.subscriptions.create("NotificationsChannel", {
      connected: function() {
      console.log("connected");
      };

      disconnected: function() {
      console.log("disconnected");
      };

      received: function(data) {
      console.log("recieved");
      };
      });






      ruby-on-rails ruby-on-rails-5 actioncable






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 27 '18 at 4:39







      Tobias Kristensen

















      asked Nov 27 '18 at 3:24









      Tobias KristensenTobias Kristensen

      445




      445
























          2 Answers
          2






          active

          oldest

          votes


















          2














          Broadcast the message from your controller like this:



          # Broadcast your message
          ActionCable.server.broadcast "notifications_channel:#{target_user.id}


          Now Update app/channels/application_cable/connection.rb with the below code



          module ApplicationCable
          class Connection < ActionCable::Connection::Base
          identified_by :current_user

          def connect
          self.current_user = find_verified_user
          logger.add_tags 'ActionCable', current_user.name
          end

          protected

          def find_verified_user
          verified_user = User.find_by(id: cookies.signed['user.id'])
          if verified_user && cookies.signed['user.expires_at'] > Time.now
          verified_user
          else
          reject_unauthorized_connection
          end
          end
          end
          end


          And subscribe to the stream like this:



          def subscribed
          stream_from "notifications_channel:#{current_user.id}"
          end



          Note: This is just an example to show how to target a specific user in Actioncable. You may have to modify the code based on
          your requirement.




          I also recommend watching this video by GoRails.






          share|improve this answer


























          • Thanks for the input. I've updated my question with the JS file I use to track the status of the notification. With your code I get the "disconnected" status. Any idea why?

            – Tobias Kristensen
            Nov 27 '18 at 4:41











          • Please provide a screenshot of your log also.

            – Abhilash Reddy
            Nov 27 '18 at 7:00











          • if you need further help we can continue the discussion here chat.stackoverflow.com/rooms/184302/…

            – Abhilash Reddy
            Nov 27 '18 at 7:04



















          0














          I managed to find the solution. Following Abhilashs answer took me most of the way, but I still had trouble authenticating the company. It seems like Warden was not fully configured, so this post made it work: env['warden'] not working with Rails 5






          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53492269%2fhow-do-you-stream-a-broadcast-to-a-specific-user-in-rails-5-with-actioncable%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            2 Answers
            2






            active

            oldest

            votes








            2 Answers
            2






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            2














            Broadcast the message from your controller like this:



            # Broadcast your message
            ActionCable.server.broadcast "notifications_channel:#{target_user.id}


            Now Update app/channels/application_cable/connection.rb with the below code



            module ApplicationCable
            class Connection < ActionCable::Connection::Base
            identified_by :current_user

            def connect
            self.current_user = find_verified_user
            logger.add_tags 'ActionCable', current_user.name
            end

            protected

            def find_verified_user
            verified_user = User.find_by(id: cookies.signed['user.id'])
            if verified_user && cookies.signed['user.expires_at'] > Time.now
            verified_user
            else
            reject_unauthorized_connection
            end
            end
            end
            end


            And subscribe to the stream like this:



            def subscribed
            stream_from "notifications_channel:#{current_user.id}"
            end



            Note: This is just an example to show how to target a specific user in Actioncable. You may have to modify the code based on
            your requirement.




            I also recommend watching this video by GoRails.






            share|improve this answer


























            • Thanks for the input. I've updated my question with the JS file I use to track the status of the notification. With your code I get the "disconnected" status. Any idea why?

              – Tobias Kristensen
              Nov 27 '18 at 4:41











            • Please provide a screenshot of your log also.

              – Abhilash Reddy
              Nov 27 '18 at 7:00











            • if you need further help we can continue the discussion here chat.stackoverflow.com/rooms/184302/…

              – Abhilash Reddy
              Nov 27 '18 at 7:04
















            2














            Broadcast the message from your controller like this:



            # Broadcast your message
            ActionCable.server.broadcast "notifications_channel:#{target_user.id}


            Now Update app/channels/application_cable/connection.rb with the below code



            module ApplicationCable
            class Connection < ActionCable::Connection::Base
            identified_by :current_user

            def connect
            self.current_user = find_verified_user
            logger.add_tags 'ActionCable', current_user.name
            end

            protected

            def find_verified_user
            verified_user = User.find_by(id: cookies.signed['user.id'])
            if verified_user && cookies.signed['user.expires_at'] > Time.now
            verified_user
            else
            reject_unauthorized_connection
            end
            end
            end
            end


            And subscribe to the stream like this:



            def subscribed
            stream_from "notifications_channel:#{current_user.id}"
            end



            Note: This is just an example to show how to target a specific user in Actioncable. You may have to modify the code based on
            your requirement.




            I also recommend watching this video by GoRails.






            share|improve this answer


























            • Thanks for the input. I've updated my question with the JS file I use to track the status of the notification. With your code I get the "disconnected" status. Any idea why?

              – Tobias Kristensen
              Nov 27 '18 at 4:41











            • Please provide a screenshot of your log also.

              – Abhilash Reddy
              Nov 27 '18 at 7:00











            • if you need further help we can continue the discussion here chat.stackoverflow.com/rooms/184302/…

              – Abhilash Reddy
              Nov 27 '18 at 7:04














            2












            2








            2







            Broadcast the message from your controller like this:



            # Broadcast your message
            ActionCable.server.broadcast "notifications_channel:#{target_user.id}


            Now Update app/channels/application_cable/connection.rb with the below code



            module ApplicationCable
            class Connection < ActionCable::Connection::Base
            identified_by :current_user

            def connect
            self.current_user = find_verified_user
            logger.add_tags 'ActionCable', current_user.name
            end

            protected

            def find_verified_user
            verified_user = User.find_by(id: cookies.signed['user.id'])
            if verified_user && cookies.signed['user.expires_at'] > Time.now
            verified_user
            else
            reject_unauthorized_connection
            end
            end
            end
            end


            And subscribe to the stream like this:



            def subscribed
            stream_from "notifications_channel:#{current_user.id}"
            end



            Note: This is just an example to show how to target a specific user in Actioncable. You may have to modify the code based on
            your requirement.




            I also recommend watching this video by GoRails.






            share|improve this answer















            Broadcast the message from your controller like this:



            # Broadcast your message
            ActionCable.server.broadcast "notifications_channel:#{target_user.id}


            Now Update app/channels/application_cable/connection.rb with the below code



            module ApplicationCable
            class Connection < ActionCable::Connection::Base
            identified_by :current_user

            def connect
            self.current_user = find_verified_user
            logger.add_tags 'ActionCable', current_user.name
            end

            protected

            def find_verified_user
            verified_user = User.find_by(id: cookies.signed['user.id'])
            if verified_user && cookies.signed['user.expires_at'] > Time.now
            verified_user
            else
            reject_unauthorized_connection
            end
            end
            end
            end


            And subscribe to the stream like this:



            def subscribed
            stream_from "notifications_channel:#{current_user.id}"
            end



            Note: This is just an example to show how to target a specific user in Actioncable. You may have to modify the code based on
            your requirement.




            I also recommend watching this video by GoRails.







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited Nov 29 '18 at 3:40

























            answered Nov 27 '18 at 4:26









            Abhilash ReddyAbhilash Reddy

            1,1401618




            1,1401618













            • Thanks for the input. I've updated my question with the JS file I use to track the status of the notification. With your code I get the "disconnected" status. Any idea why?

              – Tobias Kristensen
              Nov 27 '18 at 4:41











            • Please provide a screenshot of your log also.

              – Abhilash Reddy
              Nov 27 '18 at 7:00











            • if you need further help we can continue the discussion here chat.stackoverflow.com/rooms/184302/…

              – Abhilash Reddy
              Nov 27 '18 at 7:04



















            • Thanks for the input. I've updated my question with the JS file I use to track the status of the notification. With your code I get the "disconnected" status. Any idea why?

              – Tobias Kristensen
              Nov 27 '18 at 4:41











            • Please provide a screenshot of your log also.

              – Abhilash Reddy
              Nov 27 '18 at 7:00











            • if you need further help we can continue the discussion here chat.stackoverflow.com/rooms/184302/…

              – Abhilash Reddy
              Nov 27 '18 at 7:04

















            Thanks for the input. I've updated my question with the JS file I use to track the status of the notification. With your code I get the "disconnected" status. Any idea why?

            – Tobias Kristensen
            Nov 27 '18 at 4:41





            Thanks for the input. I've updated my question with the JS file I use to track the status of the notification. With your code I get the "disconnected" status. Any idea why?

            – Tobias Kristensen
            Nov 27 '18 at 4:41













            Please provide a screenshot of your log also.

            – Abhilash Reddy
            Nov 27 '18 at 7:00





            Please provide a screenshot of your log also.

            – Abhilash Reddy
            Nov 27 '18 at 7:00













            if you need further help we can continue the discussion here chat.stackoverflow.com/rooms/184302/…

            – Abhilash Reddy
            Nov 27 '18 at 7:04





            if you need further help we can continue the discussion here chat.stackoverflow.com/rooms/184302/…

            – Abhilash Reddy
            Nov 27 '18 at 7:04













            0














            I managed to find the solution. Following Abhilashs answer took me most of the way, but I still had trouble authenticating the company. It seems like Warden was not fully configured, so this post made it work: env['warden'] not working with Rails 5






            share|improve this answer




























              0














              I managed to find the solution. Following Abhilashs answer took me most of the way, but I still had trouble authenticating the company. It seems like Warden was not fully configured, so this post made it work: env['warden'] not working with Rails 5






              share|improve this answer


























                0












                0








                0







                I managed to find the solution. Following Abhilashs answer took me most of the way, but I still had trouble authenticating the company. It seems like Warden was not fully configured, so this post made it work: env['warden'] not working with Rails 5






                share|improve this answer













                I managed to find the solution. Following Abhilashs answer took me most of the way, but I still had trouble authenticating the company. It seems like Warden was not fully configured, so this post made it work: env['warden'] not working with Rails 5







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 27 '18 at 14:47









                Tobias KristensenTobias Kristensen

                445




                445






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53492269%2fhow-do-you-stream-a-broadcast-to-a-specific-user-in-rails-5-with-actioncable%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Contact image not getting when fetch all contact list from iPhone by CNContact

                    count number of partitions of a set with n elements into k subsets

                    A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks