ActionController :: RoutingError (маршрут не соответствует [POST] "/ blogs / my-blog-post-1") при использовании канала ActionCable - PullRequest
1 голос
/ 03 июня 2019

Это приложение, которое я начал разрабатывать как часть кода, созданного DevCamp Хотя оно помогло мне лучше понять Rails 5, в некоторых оно немного устарело места и у меня были некоторые действительно интересные времена отладки вещей, которые изменились с момента его выпуска.

Я нахожусь на этапе, когда я пытаюсь настроить блог с комментариями, привязанными к ActionCable, чтобы они обновлялись в реальном времени без обновления страницы. Когда я публикую их, я получаю сообщение об ошибке и, конечно, страница не обновляется так, как мне хотелось бы.

ActionController::RoutingError (No route matches [POST] "/blogs/my-blog-post-1")

Вот то, что я знаю, я изменил, чтобы реализовать это. Я довольно хорошо знаком с Ruby и Rails, но я новичок в Javascript и его библиотеках. Буду признателен за любую помощь, которую вы можете оказать ( см. Ветку репозитория github здесь )

routes.rb

Rails.application.routes.draw do
  devise_for :users, path: '', path_names: { sign_in: 'login', sign_out: 'logout', sign_up: 'register' }
  resources :folios, except: [:show] do
    put :sort, on: :collection
  end

  get 'folio/:id', to: 'folios#show', as: 'folio_show'

  get 'about-me', to: 'pages#about'
  get 'contact', to: 'pages#contact'

  resources :blogs do
    member do
      get :toggle_status
    end
  end

  mount ActionCable.server => '/cable'

  root to: 'pages#home'
end

Блоги Канал

class BlogsChannel < ApplicationCable::Channel
  def subscribed
    stream_from "blogs_#{params['blog_id']}_channel"
  end

  def unsubscribed
  end

  def send_comment(data)
    current_user.comments.create!(content: data['comment'], blog_id: data['blog_id'])
  end
end

connection.rb

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

    def guest_user
      guest = GuestUser.new
      guest.id = guest.object_id
      guest.name = "Guest User"
      guest.first_name = "Guest"
      guest.last_name = "User"
      guest.email = 'guest@guestuser.com'
      guest = GuestUser.new
      guest = GuestUser.new
      guest = GuestUser.new
      guest = GuestUser.new
      guest
    end

    def connect
      self.current_user = find_verified_user || guest_user
      logger.add_tags 'ActionCable', current_user.email
      logger.add_tags 'ActionCable', current_user.id
    end

    protected

    def find_verified_user
      if verified_user = env['warden'].user
        verified_user
      end
    end

  end
end

blogs.coffee (теперь в правильном каталоге файлов)

jQuery(document).on 'turbolinks:load', ->
  comments = $('#comments')
  if comments.length > 0
    App.global_chat = App.cable.subscriptions.create {
      channel: "BlogsChannel"
      blog_id: comments.data('blog-id')
    },
    connected: ->
    disconnected: ->
    received: (data) ->
      comments.append data['comment']
    send_comment: (comment, blog_id) ->
      @perform 'send_comment', comment: comment, blog_id: blog_id
  $('#new_comment').on 'ajax:before', (e) ->
    $this = $(this)
    textarea = $this.find('#comment_content')
    if $.trim(textarea.val()).length > 1
      App.global_chat.send_comment textarea.val(),
      comments.data('blog-id')
      textarea.val('')
    e.preventDefault()
    return false

Скомпилированный JS из coffeescript

var comments;

comments = $('#comments');

if (comments.length > 0) {
  App.global_chat = App.cable.subscriptions.create({
    channel: "BlogsChannel",
    blog_id: comments.data('blog-id')
  }, {
    connected: function() {},
    disconnected: function() {},
    received: function(data) {
      return comments.append(data['comment']);
    },
    send_comment: function(comment, blog_id) {
      return this.perform('send_comment', {
        comment: comment,
        blog_id: blog_id
      });
    }
  });
}

$('#new_comment').on('ajax:before', function(e) {
  var $this, textarea;
  $this = $(this);
  textarea = $this.find('#comment_content');
  if ($.trim(textarea.val()).length > 1) {
    App.global_chat.send_comment(textarea.val(), comments.data('blog-id'));
    textarea.val('');
  }
  e.preventDefault();
  return false;
});

1 Ответ

0 голосов
/ 03 июня 2019

Похоже, что вы пытаетесь остановить отправку формы, но вы делаете это не так, как при использовании rails form_with helper, по умолчанию она обрабатывает удаленную форму, поэтому вам нужно остановить специальные события rails.

Ознакомьтесь с руководством о том, как остановить удаленное событие рельсов https://guides.rubyonrails.org/working_with_javascript_in_rails.html#stoppable-events

Вам необходимо прослушивать событие ajax:before, а не событие submit.

Итак, измените $('#new_comment').submit (e) ... на $('#new_comment').on 'ajax:before', (e) ...

...