Это приложение, которое я начал разрабатывать как часть кода, созданного 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;
});