如何解决用于嵌套表单的 Ruby Action Cable
我有两个模型:post 和 comment,第二个嵌套在第一个中。我想为评论创建一个动作电缆。这是我为帖子制作的方法:它工作得非常好 - 在控制台中显示帖子的标题和内容。路线:
resources :posts do
resources :comments
end
root "posts#index"
mount ActionCable.server => '/cable'
帖子控制器:
class PostsController < ApplicationController
before_action :find_post,only: [:show,:update,:edit,:destroy]
after_action :publish_post,only: [:create]
def publish_post
ActionCable.server.broadcast "posts_channel",{title: @post.title,content: @post.content}
end
private
def find_post
@post = Post.find(params[:id])
end
end
posts_channel.rb 的代码:
class PostsChannel < ApplicationCable::Channel
def subscribed
stream_from "posts_channel"
end
def unsubscribed
# Any cleanup needed when channel is unsubscribed
end
end
和 posts_channel.js 的代码:
import consumer from "./consumer"
consumer.subscriptions.create("PostsChannel",{
connected() {
console.log('i am post')
// Called when the subscription is ready for use on the server
},disconnected() {
// Called when the subscription has been terminated by the server
},received(data) {
console.log(data)
// Called when there's incoming data on the websocket for this channel
}
});
我的评论代码非常相似,这里是评论控制器:
class CommentsController < ApplicationController
before_action :find_comment,only: [:destroy]
after_action :publish_comment,only: [:create]
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.create(params[:comment].permit(:name,:comment,:user_id,:best,:file))
redirect_to post_path(@post)
end
def publish_comment
ActionCable.server.broadcast "comments_channel",{title: @comment.name,content: @comment.comment}
end
private
def find_comment
@post = Post.find(params[:post_id])
@comment = @post.comments.find(params[:id])
end
end
comments_channel.rb 和comments_channel.rb 是一样的,但是流到comments_channel.js,这里是js 频道:
import consumer from "./consumer"
consumer.subscriptions.create("CommentsChannel",{
connected() {
console.log('I am comment')
// Called when the subscription is ready for use on the server
},received(data) {
console.log(data)
// Called when there's incoming data on the websocket for this channel
}
});
我的代码可能有什么问题?我敢肯定,我对 JS 代码做错了,它只是看不到我在帖子上创建的嵌套表单。正如我所说 - 帖子和评论频道非常相同,但有关已创建帖子的数据会广播到我的控制台,但我的评论不是,即使我在控制器中定义了哪个帖子和哪个评论系统应该看到。
解决方法
设法做到了。我决定为单个帖子创建新频道,这将由 id 确定。所以这是我的 post_channel.rb(!不是 postS_channel.rb):
class PostChannel < ApplicationCable::Channel
def subscribed
stream_from "post_channel_#{params[:post_id]}"
end
def unsubscribed
# Any cleanup needed when channel is unsubscribed
end
end
post_channel 的 Js 文件:
import consumer from "./consumer"
document.addEventListener('turbolinks:load',() => {
const element = document.getElementById('post-id');
const post_id = element.getAttribute('data-post-id');
consumer.subscriptions.create({channel: "PostChannel",post_id: post_id },{
connected() {
console.log("connected to post №" + post_id)
},disconnected() {
// Called when the subscription has been terminated by the server
},received(data) {
$('#comment_name').append('<div class="comment"> <strong>' + data.title + '</strong></div>')
$('#comment_content').append('<div class="comment">' + data.content + '</div>')
console.log(data)
}
});
})
我的评论控制器部分:
class CommentsController < ApplicationController
before_action :find_comment,only: [:destroy]
after_action :publish_comment,only: [:create]
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.create(params[:comment].permit(:name,:comment,:user_id,:best,:file))
redirect_to post_path(@post)
end
def publish_comment
ActionCable.server.broadcast("post_channel_#{@comment.post_id}",{title: @comment.name,content: @comment.comment})
end
private
def find_comment
@post = Post.find(params[:post_id])
@post_id = @post[:post_id]
@comment = @post.comments.find(params[:id])
end
end
我也将此行添加到我的路线中:
get '/posts/:id' => 'posts#show'
所以我所要做的就是指定我的代码应该广播哪个帖子来查看评论。如果有人想使用我的代码 - 小心,它会产生新的错误,您可以通过该错误获得“no Post with id=['new']”错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。