当我运行我的react-native移动应用程序时,服务器说它连接到PostChannel。它会创建帖子,但是我在“已接收”功能中没有响应,所以它不会实时更新。
这是我的反应原生代码:
import ActionCable from 'react-native-actioncable';
const APP = {};
APP.cable = ActionCable.createConsumer("http://localhost:3000/cable");
const addSocket = (dispatch) => {
const self = this;
this.subscription = APP.cable.subscriptions.create(
"PostChannel",
{
connected: () => {
console.log("connected: action cable");
},
disconnected: () => {
console.log("disconnected: action cable");
},
received: (data) => {
console.log('received', data); // no response here
dispatch(receivePost(data.post));
}
});
};
Rails代码:
频道
class PostChannel < ApplicationCable::Channel
def subscribed
stream_from "post_channel"
end
end
模型
class Post < ApplicationRecord
validates :user_id, :venue_id, presence: true
after_create_commit { PostBroadcastJob.perform_later self}
belongs_to :user
belongs_to :venue
end
工作
class PostBroadcastJob < ApplicationJob
queue_as :default
def perform(post)
ActionCable.server.broadcast 'post_channel', render_post(post)
end
private
def render_post(post)
ApplicationController.renderer.render post
end
end
发布部分
json.id post.id
json.body post.body
json.author post.author.username
json.timestamp time_ago_in_words(post.created_at)
这是服务器日志:
Started GET "/cable" for ::1 at 2017-04-19 21:14:36 -0700
Started GET "/cable/" [WebSocket] for ::1 at 2017-04-19 21:14:36 -0700
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
PostChannel is transmitting the subscription confirmation
PostChannel is streaming from post_channel
Started POST "/api/posts" for ::1 at 2017-04-19 21:14:43 -0700
Processing by Api::PostsController#create as JSON
Parameters: {"post"=>{"venue_id"=>4, "user_id"=>1, "body"=>"a"}}
Can't verify CSRF token authenticity.
(0.1ms) BEGIN
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]]
Venue Load (0.4ms) SELECT "venues".* FROM "venues" WHERE "venues"."id" = $1 LIMIT $2 [["id", 4], ["LIMIT", 1]]
SQL (0.5ms) INSERT INTO "posts" ("user_id", "venue_id", "body", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["user_id", 1], ["venue_id", 4], ["body", "a"], ["created_at", 2017-04-20 04:14:43 UTC], ["updated_at", 2017-04-20 04:14:43 UTC]]
(2.0ms) COMMIT
[ActiveJob] Enqueued PostBroadcastJob (Job ID: 4ebbf405-2bd7-43e9-94fc-e4f5195afc0f) to Async(default) with arguments: #<GlobalID:0x007f838d3a5d00 @uri=#<URI::GID gid://backend/Post/50>>
Rendering api/posts/show.json.jbuilder
Post Load (3.8ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT $2 [["id", 50], ["LIMIT", 1]]
Rendered api/posts/show.json.jbuilder (0.9ms)
[ActiveJob] [PostBroadcastJob] [4ebbf405-2bd7-43e9-94fc-e4f5195afc0f] Performing PostBroadcastJob from Async(default) with arguments: #<GlobalID:0x007f838d35dfc8 @uri=#<URI::GID gid://backend/Post/50>>
Completed 200 OK in 34ms (Views: 6.3ms | ActiveRecord: 3.1ms)
[ActiveJob] [PostBroadcastJob] [4ebbf405-2bd7-43e9-94fc-e4f5195afc0f] Rendered api/posts/_post.json.jbuilder (16.7ms)
[ActiveJob] [PostBroadcastJob] [4ebbf405-2bd7-43e9-94fc-e4f5195afc0f] Performed PostBroadcastJob from Async(default) in 26.05ms
我尝试更改作业以呈现原始帖子:
def perform(post)
ActionCable.server.broadcast 'post_channel', post
end
客户端以这种方式接收数据。但不是我需要的格式。所以我仍然需要它来使用jbuilder partial。我是否渲染了部分错误?我尝试了几种不同的方式。
有什么建议吗?